我正在尝试创建包含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
但结果是一样的。
答案 0 :(得分: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时,似乎会生成异常。
答案 1 :(得分:0)
当我从VS 2013升级到VS 2015并尝试构建一个始终构建良好的项目(ILMerge作为构建的一部分执行)时,我开始收到此错误。上面的答案提醒我私钥需要管理访问权限。然后我记得我的新VS 2015快捷方式没有设置为“以管理员身份运行”。一旦我以管理员身份重新启动VS 2015,构建的ILMerge部分工作正常。