亲爱的互联网社区。 p>
我正在为迁移到基于64位的Windows 7客户端计算机时遇到问题的客户端调查问题。他们的一个程序依赖于第三方库,如果当前的应用程序不是32位,它就会大惊小怪。
MyClientApplication调用MyThirdPartyLibrary0.dll,后者又调用MyThirdPartyLibrary1.dll。在32位环境中,我通常会这样做:
var myObject = New MyThirdPartyLibrary0.MyClass(); myObject.MyMethod();
一切都很棒。
在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运行它,那么它运行正常。我假设这是因为VS 2010是一个32位应用程序?
我注意到当使用Microsoft.VisualStudio.QualityTools.UnitTestFramework时,如果我切换到使用Patform = 64位,我就无法运行测试 - 看来这些测试无法在这些条件下运行。
我无法强迫" MyApplication成功执行MyMethod。我怀疑这里的根本原因是MyThirdPartyLibrary1.dll无法在64位应用程序上下文中运行,但是我无法找到一种方法来强制"强制"它在32位上下文中运行:在平台之间交换=任何CPU,x86和64位都会产生相同的BadImageFormatException,就像使用兼容性设置一样。此外,"排除兼容性问题"选项建议在Windows XP(SP 2)模式下运行应用程序:结果相同。
在我看来,我需要找到一种方法来将MyApplication编译为真正的32位应用程序或其他东西,但我似乎无法弄清楚如何做到这一点。
任何帮助将不胜感激, KS
答案 0 :(得分:2)
您无法将32位程序集加载到正在运行的64位进程中,也不能将64位程序集加载到正在运行的32位进程中,甚至不能加载到单独的应用程序域中。您认为它与NUnit一起使用的原因是NUnit runner 是一个32位应用程序。当我的程序集无法在NUnit中运行时,由于引用了64位C ++程序集,我遇到了类似的问题。我最终编译了两次C ++代码,并根据不安全上下文中的sizeof(int)
检查动态加载了所需的库(完全破解)。
如果必须与64位应用程序中的32位第三方DLL进行交互,我知道的唯一选择是编写一个在单独的32位主机进程中运行的包装器,并与您的应用程序通信使用进程间通信工具。这种方法带来了一些重要的性能影响,因此在采用它之前需要三思而后行。