nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

.NET StandardプロジェクトでInternalsVisibleToを設定する方法

.NETには、例えばinternalなクラスやメソッドのUnitTestをUnitTestプロジェクトから呼び出す仕組みとして、「InternalsVisibleTo」という属性があります。
従来の.NET Frameworkプロジェクトでは、プロジェクト作成時にPropertiesの下にAssemblyInfo.csが作成されその中に定義する方法が一般的でした。
しかし、.NET StandardにはAssemblyInfo.csが存在しません。

f:id:nuitsjp:20170614143527p:plain

ここでは.NET StandardプロジェクトでInternalsVisibleToを設定する方法を紹介します。

結論から言いますと、適当な「~.cs」ファイルを作成しその中に定義すれば解決できます。

順を追って説明しましょう。
プロダクト プロジェクトとしてNetStdLibが存在し、対応するUnitTestプロジェクトとしてNetStdLib.Testsを作成するものとします。
この時、スコープがinternalなつぎのようなクラスが存在したとします。

namespace NetStdLib
{
    internal class InternalClass
    {
        internal string SayHello()
        {
            return "Hello, InternalVisibleTo!";
        }
    }
}

このクラスのテストコードをNetStdLib.Tests側に作成します。
すると当然アクセスできずエラーとなります。

f:id:nuitsjp:20170614144226p:plain

そこでNetStdLib側に、通常のクラスを作成するのと同じ手続きでAssemblyInfoクラスを作成します。(ファイル名は実際のところ何でも問題ありません。)
作成すると、つぎのようなコードが自動生成されます。

f:id:nuitsjp:20170614144419p:plain

これを全て削除して、次の2行に置き換えます。

using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("NetStdLib.Tests")]

これでNetStdLib.TestsプロジェクトからNetStdLibプロジェクトのinternalレベルへのアクセスが可能となります。
以上です。