【发布时间】:2011-08-22 16:58:32
【问题描述】:
我有一个 Web 服务,每当我尝试从 Visual Studio 运行该服务时,它都会引发 BadImageFormatException。 This answer 另一个问题建议对 DLL 运行 peverify 以查看是否有任何问题。虽然我的网络服务的 DLL 很好,但网络服务依赖于一个 ILMerged 程序集,它确实有错误:
[IL]:错误:[C:\blah\MyILMergedAssembly.dll:加密
Utils.SecureStringExtensions::SecureEquals][offset 0x00000055][found unmanaged pointer] [expected unmanaged pointer] 堆栈上的非预期类型。
[IL]:错误:[C:\blah\MyILMergedAssembly.dll:加密
Utils.SecureStringExtensions::SecureEquals][offset 0x0000005D][found unmanaged pointer][expected unmanaged pointer] 堆栈上的非预期类型。
[IL]:错误:[C:\blah\MyILMergedAssembly.dll:加密
Utils.SecureStringExtensions::SecureEquals][offset 0x0000007E] 非托管指针不是可验证类型。
验证 .\MyILMergedAssembly.dll 时出现 3 个错误
(188 条警告)
我认为这些源于我在 MyILMergedAssembly 中对 Marshal 和 IntPtr 的使用,但是在我这样做的任何地方,我都将方法声明为 unsafe。如何摆脱 peverify 给出的错误,并希望摆脱在尝试运行 Web 服务时出现的 BadImageFormatException?
编辑: 看起来我可能无法使用 ILMerge 来合并具有不安全代码的程序集。所以我尝试让我的 Web 服务引用 MyILMergedAssembly 中的所有单个 DLL,但我仍然得到一个 BadImageFormatException。现在它给了我一个单独的程序集的例外。当我在那个单独的程序集上运行 peverify 时,我得到:
[IL]:错误:[C:\blah\Connection.dll:连接
.ConnectionBase::.ctor] [HRESULT 0x80070002] - 系统找不到指定的文件。
它所引用的ConnectionBase 类就在Connection.dll 中,或者至少应该是这样,因为该类是在Connection 命名空间/项目中定义的。 Connection 在其构建选项中选中了“允许不安全代码”。 ConnectionBase 中可能引用的构造函数被标记为internal。
编辑:我尝试在使用带有不安全代码的 DLL 的 Web 服务项目中检查“允许不安全代码”。我还尝试将compilerOptions="/unsafe" 添加到system.codedom > 编译器> 编译器节点中的Web 服务的Web.config 文件中。但是,当我运行 Web 服务时,我仍然会得到一个包含以下内容的页面:
无法加载文件或程序集“连接”或其依赖项之一。试图加载格式不正确的程序。
【问题讨论】:
标签: .net unmanaged ilmerge badimageformatexception peverify