フレンド アセンブリ (C# および Visual Basic)

フレンド アセンブリは、別のアセンブリの Friend 型 (Visual Basic) または internal 型 (C#) とメンバーにアクセスできるアセンブリです。 アセンブリをフレンド アセンブリとして指定すると、他のアセンブリがアクセスできるように型とメンバーをパブリックとしてマークする必要がなくなります。 これは、次のようなシナリオの場合、特に便利です。

  • 単体テスト時に、テスト コードが別のアセンブリで実行されているときに、Friend (Visual Basic) または internal (C#) とマークされているテスト対象のアセンブリ内のメンバーにアクセスする必要がある。

  • クラス ライブラリの開発時に、そのライブラリへの追加内容が別のアセンブリに含まれているが、Friend (Visual Basic) または internal (C#) とマークされている既存のアセンブリ内のメンバーへのアクセスが必要である。

解説

InternalsVisibleToAttribute 属性を使用して、特定のアセンブリに対する 1 つ以上のフレンド アセンブリを識別できます。 アセンブリ A の InternalsVisibleToAttribute 属性を使用して、アセンブリ AssemblyB をフレンド アセンブリとして指定する例を次に示します。 これにより、アセンブリ AssemblyB は、Friend (Visual Basic) または internal (C#) とマークされているアセンブリ A 内のすべての型とメンバーにアクセスできます。

注意

アセンブリ (アセンブリ A) の内部型または内部メンバーにアクセスするアセンブリ (アセンブリ AssemblyB) をコンパイルするときは、/out コンパイラ オプションを使用して、出力ファイル (.exe または .dll) の名前を明示的に指定する必要があります。 この操作が必要なのは、コンパイラが外部参照にバインドした時点では構築するアセンブリの名前がまだ生成されていないからです。 詳細については、「/out (C#)」および「/out (Visual Basic)」を参照してください。

Imports System.Runtime.CompilerServices
Imports System
<Assembly: InternalsVisibleTo("AssemblyB")> 

' Friend class.
Friend Class FriendClass
    Public Sub Test()
        Console.WriteLine("Sample Class")
    End Sub
End Class

' Public class with a Friend method.
Public Class ClassWithFriendMethod
    Friend Sub Test()
        Console.WriteLine("Sample Method")
    End Sub
End Class
using System.Runtime.CompilerServices;
using System;

[assembly: InternalsVisibleTo("AssemblyB")]

// The class is internal by default.
class FriendClass
{
    public void Test()
    {
        Console.WriteLine("Sample Class");
    }
}

// Public class that has an internal method.
public class ClassWithFriendMethod
{
    internal void Test()
    {
        Console.WriteLine("Sample Method");
    }

}

フレンドとして明示的に指定されているアセンブリだけが、Friend (Visual Basic) 型または internal (C#) 型とメンバーにアクセスできます。 たとえば、アセンブリ B がアセンブリ A のフレンド アセンブリであり、アセンブリ C がアセンブリ B を参照した場合、C は A の Friend 型 (Visual Basic) または internal 型 (C#) にはアクセスできません。

コンパイラは、InternalsVisibleToAttribute 属性に渡されるフレンド アセンブリの名前に対して基本的な検証を行います。 アセンブリ A がアセンブリ B をフレンド アセンブリとして宣言する場合、検証規則は次のようになります。

  • アセンブリ A に厳密な名前が付けられている場合、アセンブリ B にも厳密な名前が付けられている必要があります。 属性に渡されるフレンド アセンブリ名は、アセンブリ名と、アセンブリ B に署名するために使用される厳密名キーの公開キーで構成する必要があります。

    InternalsVisibleToAttribute 属性に渡されるフレンド アセンブリ名は、アセンブリ B の厳密な名前にすることはできません。アセンブリ バージョン、カルチャ、アーキテクチャ、または公開キー トークンを含めないでください。

  • アセンブリ A に厳密な名前が付けられていない場合、フレンド アセンブリ名はアセンブリ名だけで構成します。 詳細については、「方法: 署名のないフレンド アセンブリを作成する (C# および Visual Basic)」を参照してください。

  • アセンブリ B に厳密な名前が付けられている場合、プロジェクト設定によって、またはコマンド ラインで /keyfile コンパイラ オプションを使用して、アセンブリ B の厳密名キーを指定する必要があります。 詳細については、「方法: 署名されたフレンド アセンブリを作成する (C# および Visual Basic)」を参照してください。

StrongNameIdentityPermission クラスを使用した場合も型を共有できますが、次の点が異なります。

  • StrongNameIdentityPermission は、個々の型に適用され、フレンド アセンブリはアセンブリ全体に適用されます。

  • アセンブリ B と共有する必要がある型がアセンブリ A に数多く存在する場合は、それらすべてに StrongNameIdentityPermission を追加する必要があります。 フレンド アセンブリを使用すると、フレンド関係を 1 回宣言するだけで済みます。

  • StrongNameIdentityPermission を使用する場合は、共有が必要な型を public と宣言する必要があります。 フレンド アセンブリを使用する場合は、共有する型を Friend (Visual Basic) または internal (C#) と宣言します。

モジュール ファイル (拡張子が .netmodule のファイル) からアセンブリの Friend 型 (Visual Basic) または internal 型 (C#) とメソッドにアクセスする方法の詳細については、 「/moduleassemblyname (Visual Basic)」および「/moduleassemblyname (C#)」を参照してください。

参照

処理手順

方法: 署名のないフレンド アセンブリを作成する (C# および Visual Basic)

方法: 署名されたフレンド アセンブリを作成する (C# および Visual Basic)

参照

InternalsVisibleToAttribute

StrongNameIdentityPermission

アセンブリとグローバル アセンブリ キャッシュ (C# および Visual Basic)

概念

C# プログラミング ガイド

その他の技術情報

Visual Basic のプログラミング ガイド