6

プロジェクトで使用する署名されていないライブラリがいくつかあります。私のアプリケーションは強力に署名されているため、ライブラリも同様に署名されている必要があります。

以下を使用してこれらのライブラリに署名します。

"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\ildasm.exe" /nobar /all /out=library.il library.dll
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe" /dll /key=MyKey.snk library.il

問題は、バージョン番号などのメタデータが、現在署名されている DLL で失われることです。ライブラリ間のいくつかの依存関係が壊れているため、これは問題です。これらのライブラリのソース コードを実際にコンパイルせずにバージョン番号を保持するにはどうすればよいですか?

アップデート

実際には、この問題を示すのは特定の DLL であり、ILMerge を使用してビルドされていることがわかりました。おそらくこれが問題の原因です。明確にするために: ILMerge によって生成された DLL には適切なメタデータがありますが、それを逆アセンブルして再アセンブルした後でのみ、メタデータは消えます。

更新 2

Reflector で DLL を開きましたが、少なくともバージョン番号は残っているようです。Windows エクスプローラーのファイル プロパティ ダイアログ/詳細タブを使用して常に確認していました。したがって、代わりに欠落しているのはマニフェストだと思います。

4

2 に答える 2

4

なぜこれが起こるのだろうか。同様に、署名されていないアセンブリと署名されたアセンブリでilasmとildasmを使用したラウンドトリップコンパイルの経験は非常に豊富です。ILasmによって出力されたメタデータにバージョン情報(アセンブリスコープの下部)がまだ含まれていることを確認できますか?

.assembly ConsoleApplication1
{
  //...
  .hash algorithm 0x00008004
  .ver 1:0:0:0
} 

もう一度確認すると、「私のマシンで動作します」(あなたが行ったのとまったく同じコマンドラインスイッチを使用)。

実際に失われるのは、FileVersion属性(アセンブリにカーソルを合わせたときにWindowsエクスプローラーに表示される属性です。AssemblyVersion属性は引き続き存在し、正しいです。2つを混同している可能性がありますか?AssemblyVersion情報をバインドするために重要なのは、のみです。詳細については、このSO投稿を参照してください。

私が助けてくれることを願っています、さもなければあなたはより多くの文脈を提供する必要があるでしょう。

于 2010-08-16T21:35:00.507 に答える
1

ソース コードがある場合は、厳密な名前を付けてライブラリを再コンパイルするだけです。通常、逆アセンブルと再アセンブルはうまく機能しますが、それでもハックです。

ライブラリ間の依存関係を維持するには、.il コード内の参照を更新して、参照しているアセンブリの公開キーを使用する必要があります。そうしないと、アセンブリの署名されていないバージョンを参照しようとするため、読み込みに失敗します。実行時に。

これは手作業で行うこともできますが、2 ~ 3 回組み立てると非常に面倒になります。これを簡単に解決するのがsignerです。これは、関連する多くの困難に対処し、素晴らしい仕事をします。通常は非常に迅速でクリーンです。

(現在、古い .NET バージョンに対してビルドされていることに注意してください。C# 4/.NET 4 アセンブリを使用する場合は、ソースをダウンロードし、ターゲット .NET 4 に変更してから再ビルドして、signer.exe を取得する必要があります。 .NET 4 アセンブリを正しく処理します)。

于 2010-08-16T22:06:54.887 に答える