当存在非托管代码时,避免BadImageFormatException

时间:2011-05-10 18:13:54

标签: .net unmanaged ilmerge badimageformatexception peverify

我有一个Web服务,只要我尝试从Visual Studio运行该服务,就会抛出BadImageFormatException。 This answer另一个问题建议对DLL运行peverify以查看是否存在任何问题。虽然我的Web服务的DLL很好,但Web服务依赖于ILMerged程序集,它确实有错误:

  

[IL]:错误:[C:\ blah \ MyILMergedAssembly.dll:加密

     

Utils.SecureStringExtensions :: SecureEquals] [offset 0x00000055] [找到非托管指针] [预期的非托管指针]堆栈上的意外类型。

     

[IL]:错误:[C:\ blah \ MyILMergedAssembly.dll:加密

     

Utils.SecureStringExtensions :: SecureEquals] [offset 0x0000005D] [找到非托管指针] [预期的非托管指针]堆栈上的意外类型。

     

[IL]:错误:[C:\ blah \ MyILMergedAssembly.dll:加密

     

Utils.SecureStringExtensions :: SecureEquals] [offset 0x0000007E]非托管指针不是可验证的类型。

     

3个错误验证。\ MyILMergedAssembly.dll

     

(188警告)

我认为这些源于我在MyILMergedAssembly中使用MarshalIntPtr,但在我这样做的地方,我将方法声明为unsafe。如何摆脱peverify提供的错误,并希望摆脱我尝试运行我的Web服务时出现的BadImageFormatException?

编辑:看起来我可能无法使用ILMerge合并具有不安全代码的程序集。所以我尝试让我的Web服务引用MyILMergedAssembly中的所有单独的DLL,但我仍然得到BadImageFormatException。现在它给了我一个单独的程序集的例外。当我在单个组件上运行peverify时,我得到:

  

[IL]:错误:[C:\ blah \ Connection.dll:Connection

     

.ConnectionBase ::。ctor] [HRESULT 0x80070002] - 系统找不到指定的文件。

它所引用的ConnectionBase类就在Connection.dll中,或者至少应该是因为该类是在Connection名称空间/项目中定义的。 Connection在其Build选项中选中了“允许不安全的代码”。它可能引用的ConnectionBase中的构造函数标记为internal

编辑:我已尝试在使用带有不安全代码的DLL的Web服务项目中检查“允许不安全的代码”。我还尝试将compilerOptions="/unsafe"添加到system.codedom>中的Web服务的Web.config文件中。编译器>编译器节点。但是,当我运行Web服务时,我仍然会得到一个包含以下内容的页面:

  

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

1 个答案:

答案 0 :(得分:1)

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