4

サードパーティの DLL を使用する署名付きアプリケーションがあります。これらの DLL は署名されていません。- これまでのところ、最初のステップでは問題ありません: 署名しただけです (ildasm.exe で *.il を取得し、相互依存関係があるため *.il で publickeytoken を調整し、ilasm.exe で *.dll を作成しました)。

プロジェクトは正常にコンパイルされ、起動します。

しかし、私のコードで、サードパーティの DLL のクラス コンストラクターが呼び出されると (または他の何か? - 私が最初にしたことです)、「厳密な名前で署名されたアセンブリは、公開キーを指定する必要があります」というエラーが表示されます。 InternalsVisibleTo 宣言」

DLLのソースがあり、設定でAssemblyInfo.csで調整できる場合は問題ないようです

[assembly: InternalsVisibleTo("MyProject.Domain.Tests, PublicKey=..."]

しかし:上記のように、私はソースを持っていないサードパーティのDLLを持っています。したがって、このような問題を解決する方法はありません。

これを実行するための提案はありますか?

4

1 に答える 1

9

まったく同じ問題がありました。

なぜそれが起こるのか

  • サードパーティ アセンブリはInternalsVisibleTo、他のアセンブリと "フレンド" にするために で宣言されます。InternalsVisibleTo("OtherAssembly")
  • .NET では、厳密な名前のアセンブリが他の厳密な名前のアセンブリに対してのみ "フレンド" になることができる必要があります。その場合、InternalsVisibleTo属性はそれらの他のアセンブリの公開キーを指定する必要があります。InternalsVisibleTo("OtherAssembly, PublicKey=[key]")
  • InternalsVisibleTo実行時に、問題のアセンブリに対して が適切に宣言されていないことが CLR によって認識されるため、例外がスローされます。

直し方

プログラムの実行に「フレンド」アセンブリが必要ない場合 (たとえば、運用環境にデプロイされていないテスト アセンブリの場合)、次の手順に従います。

  • 問題のアセンブリを分解します。ildasm.exe ThirdParty.dll /OUTPUT=ThirdParty.il
  • テキスト エディターを使用して IL ファイルを編集し、次の宣言を削除します。InternalsVisibleTo
  • IL を組み立てて署名します。ilasm.exe ThirdParty.il /DLL /OUTPUT=ThirdParty.modified.dll /KEY=key.snk
  • : 次の方法でキーを生成します。sn.exe -k key.snk

プログラムの実行に「フレンド」アセンブリが必要な場合は、それらすべてのフレンド アセンブリに署名する必要があります。InternalsVisibleTo次に、 を削除する代わりに、各宣言を正しい公開鍵で修正する必要があることを除いて、上記と同様の手順に従います。

于 2012-08-30T17:47:35.360 に答える