次の方法で共有


フレンド アセンブリ (C# プログラミング ガイド)

更新 : 2007 年 11 月

アセンブリの内部型や内部メンバには、別のアセンブリからアクセスできます。

解説

フレンド アセンブリ機能を使用すると、内部メンバへのアクセスが可能になります。ただし、プライベート型とプライベート メンバにはアクセスできません。

アセンブリ (アセンブリ A) の内部型および内部メンバへのアクセスを別のアセンブリ (アセンブリ B) に付与するには、アセンブリ A で InternalsVisibleToAttribute 属性を使用します。

0tke9fxk.alert_note(ja-jp,VS.90).gifメモ :

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

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

使用例

次の例では、アセンブリの内部型と内部メンバに 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

参照

概念

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

参照

アセンブリとグローバル アセンブリ キャッシュ (C# プログラミング ガイド)