5

Castle.Coreを含むFakeItEasyのマージバージョンを作成しようとしています。ILMergeについて読んだところ、それが必要なソリューションのようでした。FakeItEasyをダウンロードしてビルドした後、必要なすべてのファイル(FakeItEasy.dll(.NET4)、Castle.Core.dll(.NET4)、ilmerge.exe、FakeItEasy.snk)を同じフォルダーにコピーしました。次に、次のコマンドを実行しました。

ilmerge 
    /keyfile:FakeItEasy.snk 
    /out:..\FakeItEasy.dll 
    /t:library 
    /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
    FakeItEasy.dll Castle.Core.dll 

そして、次の結果が得られました。

An exception occurred during merging:                                                             
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)                                                                                                
   at System.Compiler.Writer.MscorsnStrongNameSignatureGeneration(String wszFilePath, String wszKeyContainer, Byte[] pbKeyBlob, Int32 cbKeyBlob, IntPtr ppbSignatureBlob, IntPtr pcbSignatureBlob)  
   at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)                                              
   at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)        
   at ILMerging.ILMerge.Merge()                                                                   
   at ILMerging.ILMerge.Main(String[] args) 

「/keyfile:FakeItEasy.snk」を省略した場合、マージされたアセンブリは問題なく作成されますが、署名されたバージョンが必要なため、役に立ちません。

また、ターゲットプラットフォームを次のように指定してみました。

/targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319

しかし、結果は同じでした。

4

2 に答える 2

2

最近、Windows 8 64 ビットを実行している新しいマシンでプロジェクトをセットアップしているときに、この問題に遭遇しました。以前は Windows 7 32 ビット仮想マシンで開発していましたが、問題はありませんでした。ILMerge コマンドは、ビルド後のイベントとして実行されています。Visual Studio は 32 ビット プロセスであるため、ビルド後のイベントで使用したのと同じ ILMerge コマンドを使用して、Windows 8 64 ビット マシン上の 32 ビット Visual Studio コマンド プロンプトで動作を再現することもできました。

ILMerge.exe 
   /keyfile:public.snk 
   /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
   /t:exe 
   /ndebug 
   /out:Result.exe Source.exe Other.dll

私は .NET アプリケーションとネイティブ C++ ライブラリとのインターフェイスにかなりの量の作業を行ってきたので、例外メッセージについてよく知っていAn attempt was made to load a program with an incorrect format.ます図書館。その正確な状況が、ここで起こっていると私が信じていることです。これは 64 ビット マシンなので、64 ビット Visual Studio コマンド プロンプトで ILMerge コマンドも試しました。興味深いことに、まったく驚くべきことではありませんが、32 ビット プロンプトで例外を生成する同じコマンドが、64 ビット プロンプトでも正常に機能します。

開発時に公開キー情報のみを含む snk ファイルを使用しているため、マージされたアセンブリへの署名を遅らせています。次に、ILMerge で使用できるコマンド スイッチを調べたところ、スイッチが見つかりました/delaysign。このスイッチを ILMerge コマンドに追加すると、32 ビット プロセスから ILMerge を実行するときの問題が軽減されます。

ILMerge.exe 
   /keyfile:public.snk 
   /delaysign
   /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 
   /t:exe 
   /ndebug 
   /out:Result.exe Source.exe Other.dll

さらに興味深いのは、完全な公開鍵と秘密鍵のペアを含む snk ファイルを使用する場合、/delaysignスイッチがなくても ILMerge コマンドが正常に機能することです。そのため、公開鍵情報のみの snk ファイルを使用し、ILMerge を 32 ビット プロセスから起動すると、例外が生成されるようです。

于 2013-07-01T02:00:20.737 に答える
0

VS 2013 から VS 2015 にアップグレードし、常に正常にビルドされていたプロジェクトをビルドしようとしたときに、このエラーが発生し始めました (ILMerge はビルドの一部として実行されます)。上記の回答で、秘密鍵には管理アクセスが必要であることを思い出しました。次に、新しい VS 2015 ショートカットが「管理者として実行」に設定されていないことを思い出しました。管理者として VS 2015 を再起動すると、ビルドの ILMerge 部分が正常に機能しました。

于 2016-01-19T19:01:32.820 に答える