2008-09-24 161 views
39

我有一個應用程序,我們試圖從32位遷移到64位。它是使用x64標誌編譯的.NET。但是,我們有大量編譯爲32位的FORTRAN 90編寫的DLL。 FORTRAN DLL中的函數非常簡單:您可以將數據放入數據中;沒有任何狀態。我們也不會在那裏花費很多時間,總共有3%,但是它執行的計算邏輯是非常寶貴的。從64位進程調用32位代碼

我能以某種方式從64位代碼調用32位DLL嗎? MSDN建議我不能,期限。我做了一些簡單的黑客行爲並驗證了這一點。一切都會引發無效的入口點異常。我迄今發現的唯一可能的解決方案是爲所有32位DLL函數創建COM +包裝,並從64位進程調用COM。這似乎很頭疼。我們也可以在魔獸世界模擬中運行這個過程,但是內存上限不會增加,上限爲1.6GB左右。

是否有任何其他方式從64位CLR進程調用32位DLL?

回答

32

您需要將32位dll加載到單獨的32位進程中,並讓您的64位進程通過進程間通信與它進行通信。我不認爲有什麼辦法可以將32位dll加載到64位進程中。

有一個相當不錯的文章在這裏:

Accessing 32-bit DLLs from 64-bit code

+0

這就是我描述的64位 - > COM - > 32位的事情。在閱讀那篇文章並試圖讓樣本開始工作之後,我決定有一個更好的方法。至少我希望如此。 – 2008-09-24 17:25:13

+3

約翰的答案是正確的。無法在一個進程中混合使用32位和64位模塊。你需要開始第二個過程。另請參閱我的答案在這裏:http://stackoverflow.com/questions/6523075/how-to-force-net-application-to-run-in-32bit-mode/6533556#6533556 – 2011-07-11 09:39:04

+2

你不一定需要使用COM +包裝器,但您確實需要使用32位過程。 – 2012-01-06 02:54:40

1

你需要寫你的可執行程序的32位進程(與任何CPU或x64),這樣他們就會與WOW32加載Vista系統。這將在32位仿真模式下加載它們,您不會遇到入口點問題。您可以將庫保存爲AnyCPU模式,但可執行文件必須編譯爲x86。

0

如果你不想重新編譯你現有的dll,John的回答是正確的;不過這對你也是一種選擇。

我們的團隊目前正在將我們的x86 FORTRAN代碼遷移到x64以增加內存上限。