トレーニング
フレンド アセンブリ
"フレンド アセンブリ" とは、別のアセンブリの internal (C#) または Friend (Visual Basic) 型およびメンバーにアクセスできるアセンブリです。 AssemblyA にアセンブリ属性を追加して AssemblyB をフレンド アセンブリとして指定すると、AssemblyB からアクセスできるように AssemblyA 内の型とメンバーをパブリックとしてマークする必要がなくなります。 この方法は、特に次の状況で利便性を発揮します。
単体テスト中、テスト コードが別のアセンブリで実行されている状況で、C# では
internal
、または Visual Basic ではFriend
としてマークされる、そのテスト対象のアセンブリ内のメンバーにアクセスしなければならないとき。クラス ライブラリの開発中、そのライブラリへの追加機能が別のアセンブリにある状況で、C# では
internal
、または Visual Basic ではFriend
としてマークされる、既存アセンブリ内のメンバーにアクセスしなければならないとき。
InternalsVisibleToAttribute 属性を利用し、特定のアセンブリの 1 つまたは複数のフレンド アセンブリを特定できます。 次の例では、AssemblyA において InternalsVisibleToAttribute 属性が使われ、フレンド アセンブリとしてアセンブリ AssemblyB を指定しています。 これにより、アセンブリ AssemblyB では、Assembly A の中で internal
(C#) または Friend
(Visual Basic) としてマークされているすべての型とメンバーにアクセスすることができます。
注意
AssemblyA のような別のアセンブリの internal 型または internal メンバーにアクセスする 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 が Assembly A のフレンドであり、Assembly C で AssemblyB が参照されている場合、Assembly A の internal
(C#) または Friend
(Visual Basic) 型に Assembly C からアクセスすることはできません。
コンパイラは、InternalsVisibleToAttribute 属性に渡されるフレンド アセンブリ名の基本検証を実行します。 Assembly A で AssemblyB がフレンド アセンブリとして宣言されている場合、検証規則は次のとおりです。
Assembly A に厳密な名前が付けられている場合、AssemblyB にも厳密な名前が付けられている必要があります。 属性に渡されるフレンド アセンブリ名は、アセンブリ名と、AssemblyB の署名に使用される厳密な名前のキーの公開キーで構成されている必要があります。
AssemblyB の厳密な名前を、フレンド アセンブリ名として InternalsVisibleToAttribute 属性に渡すことはできません。 アセンブリのバージョン、カルチャ、アーキテクチャ、公開キー トークンは含めないでください。
Assembly A が厳密な名前でない場合、フレンド アセンブリの名前は、アセンブリ名のみで構成されている必要があります。 詳細については、署名のないフレンド アセンブリを作成する」を参照してください。
AssemblyB に厳密な名前が付けられている場合、プロジェクトの設定またはコマンド ラインの
/keyfile
コンパイラ オプションを使用して、AssemblyB に対して厳密な名前のキーを指定する必要があります。 詳細については、署名されたフレンド アセンブリを作成する」を参照してください。
StrongNameIdentityPermission クラスも型を共有する機能を提供しますが、次のような違いがあります。
フレンド アセンブリはアセンブリ全体に適用されますが、StrongNameIdentityPermission は個々の型に適用されます。
AssemblyB との間で共有したい型が Assembly A に数百個存在する場合、そのすべてに対して StrongNameIdentityPermission を追加する必要があります。 フレンド アセンブリを使用した場合、フレンド関係を 1 回宣言するだけで済みます。
StrongNameIdentityPermission を使用する場合、共有する型をパブリックとして宣言する必要があります。 フレンド アセンブリを使用する場合、共有する型は
internal
(C#) またはFriend
(Visual Basic) として宣言します。
アセンブリの internal
(C#) または Friend
(Visual Basic) 型およびメソッドに、モジュール ファイル ( internal
拡張子の付いたファイル) からアクセスする方法については、「Friend
」または「-moduleassemblyname (Visual Basic)」を参照してください。
.NET に関するフィードバック
.NET はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。