C#のクラスライブラリのinternalクラスを参照可能にする

今回はC#のクラスライブラリについてです。

特定の機能を外部から呼び出せるようにまとめたもので、dllとして出力されます。
TestLibというクラスライブラリプロジェクトを作成してTest1クラスを公開するのであれば下記のようになります。

namespace TestLib
{
    public class Test1
    {
        public int Value { get; set; }
    }
}

これを別のプロジェクトから参照するには、
参照にTestLib.dllを追加すれば、下記のようにして使用できます。

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var test1 = new TestLib.Test1();
        }
    }
}

さてここからが本題ですが、TestLibのほうに下記のようにinternalクラスがあるとします。

namespace TestLib
{
    internal class Test2
    {
        public int Value { get; set; }
    }
}

internalは同じアセンブリ内からしかアクセスできないので、
別プロジェクトからは参照できません。

ただ、場合によっては外部に参照させたいこともあると思います。
そんな時はdll側のアセンブリ情報ファイルに下記のように、参照させたいプロジェクト名を記載することでpublicと同様に参照可能にすることができます。

Properties/AssemblyInfo.cs

[assembly: InternalsVisibleTo("Sample")]

今回はSampleというプロジェクトにinternalアクセスを参照させたいため、
InternalsVisibleTo でSample を指定します。

これで下記のようにinternalクラスもアクセス可能になりました。

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            var test2 = new TestLib.Test2();
        }
    }
}

スポンサーリンク