アセンブリメタデータを保持しながら、外部DLLに強く署名するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3497455

  •  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アセンブリ)を正しく処理します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top