我有問題,我試圖從昨天開始解決它,但沒有運氣。 我有32位德爾福的DLL我想在.NET Win應用程序導入。這個應用程序必須建立在任何CPU模式下。當然,有BadImageFormatException來,這意味着在X64應用程序無法加載x86 DLL .. 我搜索並找到解決方案,它說我必須做包裝,但它並不清楚我。任何人都可以告訴如何解決這個問題,是否有任何可能的方式我可以導入32位Delphi的DLL在程序builted任何CPU或X64模式(也許是另一種解決方案)。32位dll導入64位.Net應用程序
回答
一個普遍的想法可能是用一個託管的32位包裝DLL封裝你的(非託管的)32位DLL並使其可見。這允許通過它的COM接口調用你的包裝器DLL。
你可以比使用COM代理來使你的COM DLL顯示爲一個進程外的COM服務器。 看看這個SO問題,以獲取關於此主題的更多信息:Access x86 COM from x64 .NET。
據我所知,你無法從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。
目前,我只有在DLL(32位一個),並沒有機會有另一個DLL - 64位版本,同時我的.NET應用程序必須被編譯爲任何CPU(它也認爲64位)。噓,這種情況下沒有任何解決辦法嗎? – scatterbraiin 2010-06-14 12:44:45
好吧,正如Lasse V. Karlsen所建議的那樣,您可以編寫一個單獨的32位應用程序(不是LIBRARY!),您可以使用進程間通信作爲單獨的進程開始並「開始討論」。 – 2010-06-14 13:04:51
一個解決方案雖然有點亂,但可以編寫一個單獨的32位應用程序,您可以從64位應用程序(例如控制檯應用程序)發送命令到/從該應用程序對話。
不漂亮,但可能工作,如果你只需要偶爾打電話給它。
我嘗試過,不完全是這樣的,我寫了類庫,在那裏我導入了Delphi DLL,編譯了x86,然後我將它引用到我的64位主應用程序中,但仍然沒有運氣。 – scatterbraiin 2010-06-14 12:54:23
因爲它是同樣的問題,只有更復雜。您的64位應用程序也不能使用32位類庫! Mikael正在談論通過命名管道或其他IPC方法與您通信的32位應用程序。 – 2010-06-14 13:03:29
我讀過,可以通過IPC,但告訴你實話,這對我來說不是很清楚。有沒有可能你有一些關於這方面的指示?我需要更多的細節,因爲它對我來說真的是新的 – scatterbraiin 2010-06-14 13:23:06
你所要做的就是在32位進程中編寫一個包裝32位DLL文件的包裝應用程序。
然後,您的64位應用程序必須通過網絡方式與此32位進程通信,或者通過COM對象或類似方式使DLL功能可用。
您不能在64位進程中運行32位DLL,不管您嘗試多麼努力,所以您需要在32位進程中運行它。
如果僅爲32位編譯應用程序不是一種選擇,您別無選擇,只能創建一個主機應用程序。
你能給我任何來源我怎麼能做到這一點? 或者你知道哪裏可以做任何細節解釋? 非常感謝 – scatterbraiin 2010-06-14 13:03:34
我很確定64位應用程序也不能使用32位COM組件,或者我在這裏錯了嗎?在使用32位COM控件之前,我遇到了這個問題,直到我將我的C#項目編譯爲X86時纔出現錯誤。 – 2010-06-14 13:05:47
不幸的是,這不是我的選擇:( – scatterbraiin 2010-06-14 13:13:26
只需將.NET應用程序編譯爲Platform x86即可。它將在x64機器上運行,並將使用您的32位DLL。不要浪費時間在包裝上。
如果底層操作系統是64位,則不是一個選項,因爲它會吞服通過操作系統層的異常,您將不會看到它們! – XMight 2014-09-29 15:09:14
你夢寐以求的是哪種神奇的操作系統配置,你可以在64位操作系統上運行32位.Net應用程序,但是異常情況會「吞噬」... – user7116 2014-10-29 00:39:39
這不是夢想,而是我的發展狀況好幾個月。我有一臺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
- 1. 使用32位或64位DLL編譯.net應用程序
- 2. 在64位.net應用程序通過c + + 64位DLL pInvoke
- 3. 如何在64位應用程序中使用win 32位dll
- 4. 32位C#應用程序如何利用64位DLL
- 5. 64位Java應用程序使用32位DLL
- 6. 試圖使用64位MFC DLL的C++ 32位應用程序
- 7. 在32位應用程序中使用64位DLL
- 8. 在64位應用程序中使用32位互操作DLL
- 9. 32位.NET應用程序和64位.NET應用程序有區別嗎?
- 10. 32位/ 64位Windows/Linux應用程序
- 11. 是否可以從32位應用程序訪問64位dll?
- 12. Windows應用程序DLL 32位和64位
- 13. 在64位應用程序中加載32位DLL庫
- 14. 在64位機器上運行32位.NET應用程序
- 15. 64位.NET應用程序中的32位ActiveX控件
- 16. 32位和64位.NET(4)應用程序之間的差異
- 17. 使用32位.NET DLL是64位.NET項目
- 18. 從32位C DLL創建64位DLL
- 19. ODBC .NET 32位和64位
- 20. 從32位應用程序啓動64位應用程序?
- 21. iOS 32與64位應用程序
- 22. Inno安裝.NET DLL調用工作在64位,失敗32位
- 23. 啓動64位進程修改32位和64位.NET machine.config中
- 24. 使用Environment.Is64BitProcess從c#應用程序動態調用32位或64位DLL
- 25. 公開64位設備驅動程序的32位/ 64位DLL API?
- 26. 使用64位與32位程序集的.NET版本
- 27. 如何強制32位應用程序在CreateObject中使用64位COM DLL?
- 28. 從64位代碼訪問32位DLL
- 29. 註冊32位和64位的DLL
- 30. 32位和64位dll的windows服務
爲什麼不將.NET應用程序編譯爲x86? – OregonGhost 2010-06-14 12:00:24
爲什麼必須編譯爲任何CPU? 32位應用程序將在64位操作系統上運行。 – juharr 2010-06-14 13:16:14
@OregonGhost因爲它是21世紀。 – sproketboy 2017-02-22 11:55:43