亲爱的互联网社区。
我正在为一个客户调查一个问题,他在迁移到基于64位的Windows 7客户机时遇到了问题。他们的一个程序依赖于第三方的库,如果当前的应用程序不是32位的,这个库就会大惊小怪。
MyClientApplication调用MyThirdPartyLibrary0.dll,MyThirdPartyLibrary1.dll又调用MyThirdPartyLibrary1.dll。在32位环境中,我通常会这样做:
MyObject.MyMethod myObject =新建MyThirdPartyLibrary0.MyClass();var ();
一切都很好。
在64位环境中,我得到了以下异常:
System.BadImageFormatException: Could not load file or assembly 'MyThirdPartyLibrary1.dll' or one of its dependencies.  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
File name: 'MyThirdPartyLibrary1.dll'
   at MyThirdPartyLibrary1.MyInnerClass.MyMethod()
   at MyThirdPartyLibrary0.MyClass.MyMethod()
   at MyApplication.Program.Main(String[] args)在我的开发人员客户端上,我在nUnit测试中运行相同的代码,它生成相同的BadImageFormatException;如果我使用Microsoft.VisualStudio.QualityTools.UnitTestFramework运行它,那么它运行正常。我想这是因为VS2010是一个32位的应用程序吧?
我注意到,当我使用Microsoft.VisualStudio.QualityTools.UnitTestFramework时,如果我切换到使用Patform = 64位,我就不能运行测试-这些测试似乎不能在这些条件下运行。
我还没能“强制”MyApplication成功地执行MyMethod。我怀疑这里的根本原因是MyThirdPartyLibrary1.dll不能在64位应用程序上下文中运行,但我找不到一种方法来“强制”它在32位上下文中运行:在Platform = Any CPU、x86和64位之间交换会产生相同的BadImageFormatException,就像玩弄兼容性设置一样。此外,"Troubleshoot compatibility“选项建议在Windows XP (SP 2)模式下运行应用程序:结果相同。
对我来说,我似乎需要找到一种方法来将MyApplication编译为真正的32位应用程序或其他什么,但我似乎不知道如何做到这一点。
任何帮助都会很感谢,KS
发布于 2012-03-02 00:24:28
不能将32位程序集加载到正在运行的64位进程中,也不能将64位程序集加载到正在运行的32位进程中,甚至不能加载到单独的应用程序域中。您看到它与NUnit一起工作的原因是NUnit runner是一个32位应用程序。当我的程序集由于对64位C++程序集的引用而无法在NUnit中运行时,我遇到了类似的问题。我最终编译了我的C++代码两次,并基于不安全上下文中的sizeof(int)检查动态加载所需的库(一个完全的黑客攻击)。
如果您必须从64位应用程序与32位第三方DLL进行交互,我所知道的唯一选择是编写一个包装器,该包装器在单独的32位主机进程中运行,并使用进程间通信工具与您的应用程序通信。这种方法带来了一些重要的性能影响,因此在采用它之前需要三思。
https://stackoverflow.com/questions/9519632
复制相似问题