3

動的コード生成を使用してプロキシ クラスを作成するプロジェクトがあります。このプロキシ クラスはプロジェクトの内部クラスを使用するため (実装の詳細が公開されないようにするため)、動的に生成されたアセンブリの名前で InternalsVisibleTo を使用します。私のクライアントが出荷されたすべてのアセンブリに厳密な名前を付けるという要件を課した最近まで、これはうまく機能していました。

この問題が発生するのは、厳密な名前のアセンブリで InternalsVisibleTo を使用するには、それが参照するアセンブリも厳密な名前である必要があり、公開キーを提供する必要があるためです。私が立ち往生しているのは、動的に生成されたアセンブリに厳密な名前を付ける方法です。これが私がこれまでに行ったことです:

  1. .snk を製品と共に出荷できるように、動的アセンブリ用の新しいキー ペアを作成しました (明らかに、プロジェクト アセンブリの残りの署名に使用される .snk を出荷したくありません)。
  2. PublicKey を抽出し、動的に参照されるアセンブリに新しい動的 PublicKey を使用するように InternalsVisibleTo を更新しました。
  3. 次のように、動的に生成されたアセンブリに署名しようとしました。

        var name = new AssemblyName("ProxyBuilderAssembly");
        var attributes = new CustomAttributeBuilder[1];
        attributes[0] =
            new CustomAttributeBuilder(typeof(AssemblyKeyFileAttribute).GetConstructor(new[] {typeof(string)}),
                                       new object[] {"Dynamic.snk"});
        _assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave, attributes);
        _module = _assembly.DefineDynamicModule("ProxyBuilderAssembly", "ProxyBuilderAssembly.dll");
    

残念ながら、これは機能しておらず、これがどのように機能するかについてのドキュメントを見つけるのに非常に苦労しています。InternalsVisibleTo 経由でアクセスできるように、動的に生成されたアセンブリに署名する方法を知っている人はいますか? 必要なクラスを公開することはできますが、カプセル化したままにしておくほうがよい実装の詳細が漏れてしまいます。

4

1 に答える 1

4

Reflection.Emit で生成されたアセンブリに署名する方法を示す「方法: 完全署名を使用して動的アセンブリに厳密な名前を付ける」記事が MSDN にあります。

StrongNameKeyPair kp;
// Getting this from a resource would be a good idea.
using(stream = GetStreamForKeyPair())
{
    kp = new StrongNameKeyPair(fs);
}
AssemblyName an = new AssemblyName();
an.KeyPair = kp;
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
于 2011-02-08T18:35:59.170 に答える