次の方法で共有


フレンド アセンブリ

フレンド アセンブリは、別のアセンブリの内部 (C#) または Friend (Visual Basic) の型とメンバーにアクセスできるアセンブリです。 AssemblyB をフレンド アセンブリとして識別するために AssemblyA にアセンブリ属性を追加する場合、AssemblyB からアクセスするために AssemblyA の型とメンバーをパブリックとしてマークする必要がなくなりました。 これは、次のシナリオで特に便利です。

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

  • クラス ライブラリを開発する場合、ライブラリへの追加は別のアセンブリに含まれていますが、C# または Visual Basic でinternalFriendとしてマークされている既存のアセンブリのメンバーにアクセスする必要があります。

注釈

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

AssemblyA などの別のアセンブリの内部型または内部メンバーにアクセスする AssemblyB などのアセンブリをコンパイルする場合は、-out コンパイラ オプションを使用して、出力ファイル (.exe または .dll) の名前を明示的に指定する必要があります。 これは、コンパイラが外部参照にバインドする時点で、ビルド中のアセンブリの名前をまだ生成していないために必要です。 詳細については、「 OutputAssembly (C#) 」または 「-out (Visual Basic)」を参照してください。

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");
    }

}
Imports System.Runtime.CompilerServices
<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

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

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

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

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

  • アセンブリ A が厳密な名前でない場合、フレンド アセンブリ名はアセンブリ名のみで構成する必要があります。 詳細については、「 方法: 署名されていないフレンド アセンブリを作成する」を参照してください。

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

StrongNameIdentityPermission クラスには、型を共有する機能も用意されています。その違いは次のとおりです。

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

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

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

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

こちらも参照ください