gpt4 book ai didi

.net - 使用 ILMerge 创建签名库抛出异常

转载 作者:行者123 更新时间:2023-12-02 08:19:27 28 4
gpt4 key购买 nike

我正在尝试创建包含 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

但结果是一样的。

最佳答案

我最近在运行 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 应用程序和 native C++ 库接口(interface)方面做了相当多的工作,因此我非常熟悉异常消息尝试加载格式不正确的程序。 这表明存在位数问题,例如,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 时,似乎会生成异常。

关于.net - 使用 ILMerge 创建签名库抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11418524/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com