web-dev-qa-db-ja.com

厳密な名前のアセンブリで「InternalsVisibleTo」属性を使用する方法

アセンブリで "InternalsVisibleTo"属性を使用して、ユニットテストプロジェクトに内部メソッド/クラスを公開しています。

そのアセンブリをGACにインストールする必要があるため、厳密な名前を付ける必要があります。それをしようとすると、Visual Studioで次のエラーが発生します。

厳密な名前の署名済みアセンブリは、InternalsVisibleTo宣言で公開キーを指定する必要があります

グーグルのビットは私に以下の記事に連れて行ってくれました。

https://msdn.Microsoft.com/en-us/library/bb763089.aspx

この記事の状態:

「厳密な名前の友人アセンブリの公開キーを決定します。」

この記事では、公開鍵の決定方法については触れていません。アセンブリの公開キーはどこにありますか?また、公開キーを取得したら、これは属性を宣言する正しい方法でしょうか?

[Assembly: InternalsVisibleTo("Namespace.Assembly.Example.Name, PublicKey=ThePublicKey")]
27
Dave

InternalsVisibleToを強く署名されたアセンブリで使用するには、「友人」アセンブリも強く署名されている必要があります。テストアセンブリのパブリックトークンは、InternalsVisibleTo値の一部として指定する必要があります。

この属性は、コンパイル時のアセンブリの実際の検証には使用されないことに注意してください。実行時チェック(および友人のアセンブリのコンパイル時チェック)がそのIDを検証することのみを指定します。したがって、justメインアセンブリをコンパイルする必要がある場合、任意の公開キートークン(つまり、Web内のすべてのアセンブリ参照にあるMicrosoftのアセンブリからのトークン)を指定できます。たとえば、Config)。

通常、アセンブリに署名するので、公開キーを知っているでしょう。つまりsnkファイルがある場合、sn -t youSnk.snkは公開鍵を表示します。または、 Visual Studio 内でのアセンブリの公開キートークンの取得の手順に従って、sn -Tp {path to Assembly}を使用してアセンブリから公開キーを取得するアセンブリの公開トークンを表示するようにVSを構成できます。 。 (ドキュメントがなくなっている場合、ステップは この質問に対する他の回答にコピーされます

18
Alexei Levenkov

2019年5月更新: Visual Studio 2019で完全に動作します。


Visual Studio 2017を使用している人には、最新の方法があります:

最愛のIDEから、「ツール>外部ツール...」および「追加」の設定​​で新しいツールに移動します。

  • タイトル:Get PublicKey
  • コマンド: "C:\ Program Files(x86)\ Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\sn.exe"(/!\ NETFXツールのバージョンを選択するAssembly NETFXバージョンと一致します。ここでは4.6.2です)
  • 引数:-Tp $(TargetPath)
  • [出力ウィンドウを使用]チェックボックスをオンにします

適用/ OKこれらの変更。

「ソリューションエクスプローラー」でプロジェクトのアセンブリ名をクリックしますに進み、「ツール> PublicKeyの取得」に進みます。 [出力]ウィンドウには、(非常に長い)公開キーと、公開トークンキーが表示されます。

最後に、公開する内部クラスを保持するプロジェクト(つまり、テスト済みのプロジェクト)で、「AssemblyInfo.cs」ファイルを開き、次の行を追加します。

[アセンブリ:InternalsVisibleTo( "MyCompany.SolutionName.ProjectName、PublicKey =ここに公開鍵を貼り付けます")

/!\公開キーから改行を削除する必要があります。

それは私にとって完璧に働いたので、うまくいけばそれもあなたのためにトリックをするでしょう!

47
Invvard

リリース構成をテストしない場合、これは簡単な回避策です。

#if DEBUG
[Assembly: InternalsVisibleTo("TestProjNamespace")]
#endif
2
Chad Grant