C# InternalsVisibleToAttribute と アセンブリの署名

InternalsVisibleToAttribute クラスアセンブリに指定すると、internal な物が指定したアセンブリから参照出来る。
internal な物ってのは、internal (C# リファレンス) に載ってるんだけど、同じアセンブリ内なら参照可能なアクセス修飾子。
どんな時に使うのかは、MSDN をそのまま引用。

内部アクセスは、コンポーネントのグループがアプリケーション コードの残りの部分には公開されないプライベートな手法で協調動作できるので、一般的にはコンポーネント ベースの開発に使用されます。たとえば、グラフィカル ユーザー インターフェイスを構築するためのフレームワークでは、内部アクセスでメンバを使用して協調動作する Control クラスと Form クラスを提供できます。これらのメンバは内部メンバなので、フレームワークを使用するコードに対しては公開されません。

あと、僕は UnitTest を行うコードは、 private ではなくinternal で宣言してます。(使い方があってるかどうかは、不明。)
んで、UnitTest を実装するアセンブリに対してだけ、InternalsVisibleToAttribute を使って公開します。こんな感じ。

#if DEBUG
[assembly:InternalsVisibleTo("〜.Test")]
#endif

#if DEBUG 〜 #endif で囲ってるのは、Debug 時にしか有効にしないため。Release 時には、internal な物を公開する必要はないから。


んで、ここからが本題。
アセンブリに対して署名を行っていると、InternalsVisibleToAttribute を使って公開する先のアセンブリも署名をしている必要がある模様。
署名を行っているアセンブリに対して、InternalsVisibleToAttribute を指定する方法は、InternalsVisibleToAttribute クラス に載ってるんだけど、

属性を厳密な名前付きフレンド アセンブリに適用するには、フレンド アセンブリの公開キーを表す 16 進文字列を知っている必要があります。


AssemblyB、AssemblyB のすべてのバージョン、および異なるカルチャを格納している可能性がある AssemblyB のすべてのバリアントから、宣言元のアセンブリ内で internal キーワードを使用してマークされている型と型のメンバを参照できるようにする例を次に示します。
[assembly:InternalsVisibleTo("AssemblyB, PublicKey=32ab4ba45e0a69a1")]

公開キー と書いてるんだけど、サンプルコードで指定している PublicKey は PublicKeyToken の長さだから、PublicKeyToken の方を指定してて暫くコンパイルエラーで悩んだよ。。
調べたら、フレンド アセンブリ | Mimori's Algorithms Press を見つけてやっと解決出来た。
※公開キー(PublicKey)と公開キートークン(PublicKeyToken)については、VSTO 2003 の配置について - お だ のスペース でも紹介した
@IT:インサイド .NET Framework [改訂版]第2回 アセンブリのアイデンティティ に解説されてます。