2010-06-14 148 views
7

我有問題,我試圖從昨天開始解決它,但沒有運氣。 我有32位德爾福的DLL我想在.NET Win應用程序導入。這個應用程序必須建立在任何CPU模式下。當然,有BadImageFormatException來,這意味着在X64應用程序無法加載x86 DLL .. 我搜索並找到解決方案,它說我必須做包裝,但它並不清楚我。任何人都可以告訴如何解決這個問題,是否有任何可能的方式我可以導入32位Delphi的DLL在程序builted任何CPU或X64模式(也許是另一種解決方案)。32位dll導入64位.Net應用程序

+2

爲什麼不將.NET應用程序編譯爲x86? – OregonGhost 2010-06-14 12:00:24

+2

爲什麼必須編譯爲任何CPU? 32位應用程序將在64位操作系統上運行。 – juharr 2010-06-14 13:16:14

+1

@OregonGhost因爲它是21世紀。 – sproketboy 2017-02-22 11:55:43

回答

5

一個普遍的想法可能是用一個託管的32位包裝DLL封裝你的(非託管的)32位DLL並使其可見。這允許通過它的COM接口調用你的包裝器DLL。

你可以比使用COM代理來使你的COM DLL顯示爲一個進程外的COM服務器。 看看這個SO問題,以獲取關於此主題的更多信息:Access x86 COM from x64 .NET

2

據我所知,你無法從64位應用程序使用32位DLL。也就是說,你可以編譯你的X86應用程序。

您找到的解決方案可能是關於如何在「任何CPU」編譯項目中使用32位和64位版本的DLL,具體取決於應用程序是以32位還是64位運行,位環境。

爲此,您可以在C#中編寫兩個包裝器DLL,一個用於64位,一個用於32位,並使用相應的包裝器,具體取決於您是在64位還是32位操作系統上運行。

但是,當你擁有的只是一個32位DLL時,這不起作用。一個64位應用程序不能使用32位DLL,以及一個32位應用程序不能使用64位DLL。

因此,您需要編譯您的應用程序爲32位,或者您必須創建一個64位版本的DLL。

+0

目前,我只有在DLL(32位一個),並沒有機會有另一個DLL - 64位版本,同時我的.NET應用程序必須被編譯爲任何CPU(它也認爲64位)。噓,這種情況下沒有任何解決辦法嗎? – scatterbraiin 2010-06-14 12:44:45

+0

好吧,正如Lasse V. Karlsen所建議的那樣,您可以編寫一個單獨的32位應用程序(不是LIBRARY!),您可以使用進程間通信作爲單獨的進程開始並「開始討論」。 – 2010-06-14 13:04:51

1

一個解決方案雖然有點亂,但可以編寫一個單獨的32位應用程序,您可以從64位應用程序(例如控制檯應用程序)發送命令到/從該應用程序對話。

不漂亮,但可能工作,如果你只需要偶爾打電話給它。

+0

我嘗試過,不完全是這樣的,我寫了類庫,在那裏我導入了Delphi DLL,編譯了x86,然後我將它引用到我的64位主應用程序中,但仍然沒有運氣。 – scatterbraiin 2010-06-14 12:54:23

+0

因爲它是同樣的問題,只有更復雜。您的64位應用程序也不能使用32位類庫! Mikael正在談論通過命名管道或其他IPC方法與您通信的32位應用程序。 – 2010-06-14 13:03:29

+0

我讀過,可以通過IPC,但告訴你實話,這對我來說不是很清楚。有沒有可能你有一些關於這方面的指示?我需要更多的細節,因爲它對我來說真的是新的 – scatterbraiin 2010-06-14 13:23:06

14

你所要做的就是在32位進程中編寫一個包裝32位DLL文件的包裝應用程序。

然後,您的64位應用程序必須通過網絡方式與此32位進程通信,或者通過COM對象或類似方式使DLL功能可用。

不能在64位進程中運行32位DLL,不管您嘗試多麼努力,所以您需要在32位進程中運行它。

如果僅爲32位編譯應用程序不是一種選擇,您別無選擇,只能創建一個主機應用程序。

+0

你能給我任何來源我怎麼能做到這一點? 或者你知道哪裏可以做任何細節解釋? 非常感謝 – scatterbraiin 2010-06-14 13:03:34

+0

我很確定64位應用程序也不能使用32位COM組件,或者我在這裏錯了嗎?在使用32位COM控件之前,我遇到了這個問題,直到我將我的C#項目編譯爲X86時纔出現錯誤。 – 2010-06-14 13:05:47

+0

不幸的是,這不是我的選擇:( – scatterbraiin 2010-06-14 13:13:26

1

只需將.NET應用程序編譯爲Platform x86即可。它將在x64機器上運行,並將使用您的32位DLL。不要浪費時間在包裝上。

+0

如果底層操作系統是64位,則不是一個選項,因爲它會吞服通過操作系統層的異常,您將不會看到它們! – XMight 2014-09-29 15:09:14

+0

你夢寐以求的是哪種神奇的操作系統配置,你可以在64位操作系統上運行32位.Net應用程序,但是異常情況會「吞噬」... – user7116 2014-10-29 00:39:39

+2

這不是夢想,而是我的發展狀況好幾個月。我有一臺64位的開發機器,如果您爲x86平臺編譯,則會吞併異常(並行任務,而不僅僅是)。 Visual Studio只是在輸出窗口中顯示「異常的第一次機會」,顯然你不會在客戶端應用程序中看到運行。原因:http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/ – XMight 2014-10-29 08:55:23

相關問題