2012-03-01 66 views
0

亲爱的互联网社区。第三方库需要32位应用程序?

我正在研究一个客户在迁移到基于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位I不能运行测试 - 它出现这些测试不能在这些条件下运行。

我一直无法“强制”MyApplication成功执行MyMethod。我怀疑这里的根本原因是MyThirdPartyLibrary1.dll无法在64位应用程序上下文中运行,但我无法找到一种方式来“强制”它在32位上下文中运行:在Platform = Any CPU之间交换,x86和64位都会产生相同的BadImageFormatException,就像玩兼容性设置一样。此外,“疑难解答兼容性”选项建议在Windows XP(SP 2)模式下运行应用程序:结果相同。

在我看来,我需要找到一种方法来编译MyApplication作为一个真正的32位应用程序或东西,但我似乎无法弄清楚如何做到这一点。

任何帮助,将理解的是, KS

回答

2

不能加载32位汇编成运行64位过程中,或在64位组装到运行32位过程,而不是连成一单独的应用领域。你看到它与NUnit一起工作的原因是NUnit 跑步者是一个32位应用程序。当我的程序集由于引用64位C++程序集而无法在NUnit中运行时遇到类似的问题。我最终编译了我的C++代码两次,并根据在不安全上下文(完全黑客)中的sizeof(int)检查动态加载所需的库。

如果您必须从64位应用程序与32位第三方DLL进行交互,我知道的唯一选择是编写一个在单独的32位主机进程中运行的包装,并与您的应用程序使用进程间通信设施。这种方法带来了一些重要的性能影响,所以在采用它之前需要三思而行。

+1

谢谢你的回复。关于NUnit赛跑者;我很怀疑。如果第三方供应商无法提供64位版本,我想我会查看32位包装(叹气!)。 – 2012-03-06 08:51:55