3

我有一个 Web 服务,每当我尝试从 Visual Studio 运行该服务时,它都会引发 BadImageFormatException。 This answer to another question建议对 DLL 运行 peverify 以查看是否有任何问题。虽然我的 web 服务的 DLL 很好,但 web 服务依赖于一个 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] 非托管指针不是可验证的类型。

3 验证 .\MyILMergedAssembly.dll 的错误

(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 > compilers > compiler 节点中添加 Web 服务的 Web.config 文件。但是,当我运行 Web 服务时,我仍然会得到一个包含以下内容的页面:

无法加载文件或程序集“连接”或其依赖项之一。试图加载格式不正确的程序。

4

1 回答 1

1

哦,伙计,这很烦人。这不是不安全的代码,不是我在 VS 项目中的 32/64 位目标平台设置,也不是 ILMerge。我必须在 IIS 7 的应用程序池上将启用 32 位应用程序设置设置为 True(我在 Windows 7 64 位)。重新启动应用程序池后,我的 Web 服务加载正常。感谢这个博客让我朝着正确的方向前进。

于 2011-05-10T19:08:04.587 回答