アセンブリメタデータを保持しながら、外部DLLに強く署名するにはどうすればよいですか?
-
29-09-2019 - |
質問
プロジェクトで署名していないいくつかのライブラリがあります。私のアプリケーションは強く署名されているため、ライブラリも同様にある必要があります。
これらのライブラリに署名して:
"%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
私はリフレクターでDLLを開きましたが、少なくともバージョン番号はまだそこにあるようです。 Windows Explorerの[ファイルプロパティ]ダイアログ/詳細タブを使用して常にチェックしていました。ですから、代わりに欠落しているのはマニフェストだと思います。
解決
なぜこれが起こるのか疑問に思っています。同様に、IlasmとIldasmを使用してIlasmとIldasmを使用した往復コンパイルで非常に良い経験をしています。 ILASMによるメタデータ出力を確認できますか?
.assembly ConsoleApplication1
{
//...
.hash algorithm 0x00008004
.ver 1:0:0:0
}
もう一度チェックしただけで、「マシンで動作します」(あなたとまったく同じコマンドラインスイッチを使用して)。
実際に失われるのはです fileversion 属性(アセンブリの上にホバリングするときにWindows Explorerに表示されるもの。 アセンブリバージョン 属性はです まだ存在して正しい. 。あなたは2つを混乱させているのでしょうか?のみ AssemblyVersion
拘束力のある情報にとって重要です。これを参照してください だから投稿してください 詳細については。
私が助けることができることを願っています。そうでなければ、より多くのコンテキストを提供する必要があります。
他のヒント
ソースコードをお持ちの場合は、強い名前でライブラリを再コンパイルするだけです。通常、分解と再組み立ては非常にうまく機能しますが、それでもハックです。
ライブラリ間の依存関係を動作させるには、参照しているアセンブリの公開鍵を使用するために.ilコードの参照を更新する必要があります。そうしないと、アセンブリの署名されていないバージョンを参照しようとするため、ロードできません。実行時に。
これは手作業で行うことができますが、2つまたは3つのアセンブリの後に非常に退屈になります。これの簡単な修正はです 歌手, 、これはあなたのために関係する多くの困難を扱い、素晴らしい仕事をします - それは通常かなり迅速できれいです。
(現在、古い.NETバージョンに対して構築されていることに注意してください。C#4/.NET 4アセンブリを使用する場合は、ソースをダウンロードする必要があります。それは.NET 4アセンブリ)を正しく処理します)。