2012-03-01 68 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