我有一个 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 服务时,我仍然会得到一个包含以下内容的页面:
无法加载文件或程序集“连接”或其依赖项之一。试图加载格式不正确的程序。