フレンド アセンブリ (C# プログラミング ガイド)
更新 : 2007 年 11 月
アセンブリの内部型や内部メンバには、別のアセンブリからアクセスできます。
解説
フレンド アセンブリ機能を使用すると、内部メンバへのアクセスが可能になります。ただし、プライベート型とプライベート メンバにはアクセスできません。
アセンブリ (アセンブリ A) の内部型および内部メンバへのアクセスを別のアセンブリ (アセンブリ B) に付与するには、アセンブリ A で InternalsVisibleToAttribute 属性を使用します。
メモ : |
---|
アセンブリ (アセンブリ A) の内部型または内部メンバにアクセスするアセンブリ (アセンブリ B) をコンパイルするときは、/out コンパイラ オプションを使用して、出力ファイル (.exe または .dll) の名前を明示的に指定する必要があります。詳細については、/out を参照してください。この操作が必要なのは、コンパイラが外部参照にバインドした時点では構築するアセンブリの名前がまだ生成されていないからです。 |
StrongNameIdentityPermission クラスを使用した場合も型を共有できますが、次の点が異なります。
StrongNameIdentityPermission は、個々の型に適用され、フレンド アセンブリはアセンブリ全体に適用されます。
アセンブリ B と共有する必要がある型がアセンブリ A に数多く存在する場合、StrongNameIdentityPermission では、すべての型を修飾する必要がありますが、フレンド アセンブリを使用すると、フレンド関係を 1 回宣言するだけで済みます。
StrongNameIdentityPermission を使用する場合は、共有が必要な型を public と宣言する必要があります。フレンド アセンブリを使用する場合は、共有する型を internal と宣言します。
アセンブリ内の非パブリック型にアクセスできる .netmodule を構築する方法については、「/moduleassemblyname (モジュールに対するフレンド アセンブリの指定) (C# コンパイラ オプション)」を参照してください。
使用例
次の例では、アセンブリの内部型と内部メンバに cs_friend_assemblies_2 というアセンブリがアクセスできるようにしています。
// cs_friend_assemblies.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
using System;
[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]
// internal by default
class Class1
{
public void Test()
{
Console.WriteLine("Class1.Test");
}
}
// public type with internal member
public class Class2
{
internal void Test()
{
Console.WriteLine("Class2.Test");
}
}
次の例では、アセンブリが cs_friend_assemblies.dll アセンブリの内部型と内部メンバを使用します。
出力ファイル (/out:cs_friend_assemblies_2.exe) の名前を明示的に指定する必要があることに注意してください。
このアセンブリが内部型と内部メンバへのアクセスを別のアセンブリ (アセンブリ C) に提供した場合でも、アセンブリ C は、自動的には cs_friend_assemblies.dll アセンブリのフレンドになりません。
// cs_friend_assemblies_2.cs
// compile with: /reference:cs_friend_assemblies.dll /out:cs_friend_assemblies_2.exe
public class M
{
static void Main()
{
// access an internal type
Class1 a = new Class1();
a.Test();
Class2 b = new Class2();
// access an internal member of a public type
b.Test();
}
}
Class1.Test
Class2.Test
次の例は、内部型と内部メンバへのアクセスを、厳密な名前を持つアセンブリに提供する方法を示しています。
キーファイルを生成してパブリック キーを表示するには、次の sn.exe コマンドのシーケンスを使用します。詳細については、「厳密名ツール (Sn.exe)」を参照してください。
sn -k friend_assemblies.snk // 厳密な名前キーを生成します。
sn -p friend_assemblies.snk key.publickey // key.snk から key.publickey にパブリック キーを抽出します。
sn -tp key.publickey // ファイル key.publickey に格納されているパブリック キーを表示します。
/keyfile を使用して、キーファイルをコンパイラに渡します。
// cs_friend_assemblies_3.cs
// compile with: /target:library /keyfile:friend_assemblies.snk
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("cs_friend_assemblies_4, PublicKey=0024000004800000940000000602000000240000525341310004000001000100031d7b6f3abc16c7de526fd67ec2926fe68ed2f9901afbc5f1b6b428bf6cd9086021a0b38b76bc340dc6ab27b65e4a593fa0e60689ac98dd71a12248ca025751d135df7b98c5f9d09172f7b62dabdd302b2a1ae688731ff3fc7a6ab9e8cf39fb73c60667e1b071ef7da5838dc009ae0119a9cbff2c581fc0f2d966b77114b2c4")]
class Class1
{
public void Test()
{
System.Console.WriteLine("Class1.Test");
}
}
次の例は、厳密な名前を持つアセンブリがアクセスできる内部型と内部メンバを使用する方法を示しています。
// cs_friend_assemblies_4.cs
// compile with: /keyfile:friend_assemblies.snk /reference:cs_friend_assemblies_3.dll /out:cs_friend_assemblies_4.exe
public class M
{
static void Main()
{
Class1 a = new Class1();
a.Test();
}
}
Class1.Test