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.这表明存在位问题,例如,32 位进程尝试加载 64 位图书馆。我认为正是这种情况。由于这是一台 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 文件时,ILMerge 命令可以在没有/delaysign开关的情况下正常工作。因此,当使用仅包含公钥信息的 snk 文件以及从 32 位进程启动 ILMerge 时,似乎会生成异常。

于 2013-07-01T02:00:20.737 回答
0

当我从 VS 2013 升级到 VS 2015 并尝试构建一个始终构建良好的项目时,我开始收到此错误(ILMerge 作为构建的一部分执行)。上面的答案提醒我,私钥需要管理权限。然后我记得我的新 VS 2015 快捷方式没有设置为“以管理员身份运行”。一旦我以管理员身份重新启动 VS 2015,构建的 ILMerge 部分工作正常。

于 2016-01-19T19:01:32.820 回答