--- lang: ja-jp breaks: true --- # C# `InternalsVisibleTo` 内部アクセスを許可するDLLを指定する 2021-08-18 ## 厳密な名前のキーファイルを作成 プロジェクトのプロパティから署名を選択し、`アセンブリに署名する`にチェックを入れる。 ![](https://i.imgur.com/XNMaz4s.png) `<新規作成...>`を選択し、キーファイルの名前を入力する。 ※`キーファイルをパスワードで保護する`のチェックは外して良い。 ![](https://i.imgur.com/wvHmoBY.png) ## 内部アクセスを許可するDLLのアセンブリに署名する #### 作成されたキーファイルを選択する ![](https://i.imgur.com/qtM49FI.png) :::info 上記で、キーファイルを新規作成した場合は、自動的に選択された状態となります。 ::: #### XXXXXXXX.csproj ```xml= <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> ・・・ <AssemblyName>XXXXXXXX</AssemblyName> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <SignAssembly>true</SignAssembly> <AssemblyOriginatorKeyFile>XXXXXXXX.snk</AssemblyOriginatorKeyFile> </PropertyGroup> ・・・ ``` ## 内部アクセスを許可するDLLの`PublicKey`を取得する 開発者コマンドプロンプトを立ち上げて、`sn -Tp`コマンドを実行する。 ![](https://i.imgur.com/WVTeO3V.png) ```shell= >sn -Tp XXXXXXXX.dll Microsoft(R) .NET Framework Strong Name Utility バージョン 4.0.30319.0 Copyright (c) Microsoft Corporation. All rights reserved. 公開キー (ハッシュ アルゴリズム: sha1): 00240000048000009400000006020000002400005253413100040000010001007d7e3180538a13 f08e21a7436cfe7b355841cbc5680c4fdcd8cdeb23bb61363ab9743e8a3555e2bbad01dc010c98 13dd7fe82c80a3c56126db37f263d9945aaefe9919a03b2c96b34717a7a3a1191a938c25e78fa1 8825ecd68e29c14f684e6ef82d47753d94512ac5e06aed50098a1e4c8bc68da3e8cb9b4aa1670e 6792d99d 公開キー トークン 3717df768deb6116 ``` #### `sn`コマンドの場所 ※参考 ```shell= >where sn C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\sn.exe ``` ## `InternalsVisibleTo`を設定する #### AssemblyInfo.cs `公開キー (ハッシュ アルゴリズム: sha1):`を一行にまとめて、`AssemblyInfo.cs`内に`InternalsVisibleTo`を記述します。 ```csharp= [assembly: InternalsVisibleTo("XXXXXXXX, PublicKey=00240000048000009400000006020000002400005253413100040000010001007d7e3180538a13f08e21a7436cfe7b355841cbc5680c4fdcd8cdeb23bb61363ab9743e8a3555e2bbad01dc010c9813dd7fe82c80a3c56126db37f263d9945aaefe9919a03b2c96b34717a7a3a1191a938c25e78fa18825ecd68e29c14f684e6ef82d47753d94512ac5e06aed50098a1e4c8bc68da3e8cb9b4aa1670e6792d99d")] ``` :::info `XXXXXXXX.dll`にinternalアクセスを許可する場合 ::: ## .NET SDKスタイルのプロジェクトで、厳密な名前を使用せずに `InternalsVisibleTo` を設定する方法 プロジェクトに適当な名前の`*.cs`ファイルを作成し、以下のように定義する。 ```csharp= using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("XXXXProjectName")] ``` :::info `XXXXProjectName.dll`にinternalアクセスを許可する場合 ::: ###### tags: `C#` `InternalsVisibleTo` `sn` `署名` `キーファイル` `snk` `厳密な名前`