簡體   English   中英

從64位exe訪問32位DLL的方法

[英]Ways to access a 32bit DLL from a 64bit exe

我有一個必須編譯並在64位模式下運行的項目。 不幸的是,我需要調用一個僅在32位模式下可用的DLL,因此我無法在一個Visual Studio項目中容納所有內容。 我正在努力找到將32位DLL包裝在自己的exe / service中的最佳方法,並從我的64位應用程序發出遠程(盡管在同一台機器上)調用該exe / service。 我的操作系統是Win7 Pro 64位。

對此32位進程的所需調用是每秒幾十次,但數據量很小。 這是一個實時圖像分析應用程序,因此盡管音量低,響應時間仍然很重要。 大量發送/接收單個基元。

理想情況下,我會托管一個WCF服務來容納這個DLL,但在64位操作系統中,不能強制服務作為x86運行! 來源 這真的很不幸,因為我在我的機器上調用WCF服務的函數只有4毫秒。

我已經嘗試過命名管道.net。 我發現它們比WCF慢40-50倍(對我來說無法使用)。

任何其他選擇或建議,以最好的方式來解決我的難題?

正如您所記得的那樣,在同一個過程中無法混合位數。 您需要為32位部分單獨處理。

我認為托管WCF服務是正確的方法。 您的鏈接僅涉及wcfsvchost。 我很確定你可以創建自己的Windows服務,並在32位上托管WCF服務。

請參閱此鏈接: 如何在托管應用程序中托管WCF服務 您可以在任何托管應用程序(包括Windows服務)中托管您的服務,並在您喜歡的位置下運行它。

這是在應用程序中自托管WCF服務所需的代碼量,假設您剛剛創建了一個名為MyService的新服務,並且已將相應的配置添加到app.config:

class Program
{
    static void Main(string[] args)
    {
        using(ServiceHost host = new ServiceHost(typeof(MyService), new Uri[0]))
        {
            host.Open();
            Console.ReadKey();    
        }
    }
}

如果您將它顯式編譯為32或64位,上面的程序也會運行。

沒有。 點。 64位進程中的32位dll =不行。

我所做的是運行32位包裝器進程並使用WCF與它進行通信 - 就像你一樣。 我可以強制操作系統運行32位。

我有一個核心庫(Tradex.Connectivity.Core),與平台無關的.NET代碼。 我有兩個包裝器(Wrapper32.exe,Wapper64.exe)啟動並加載獨立代碼,然后加載類(托管C ++)。 奇跡般有效。

對我來說,這幾乎是唯一的方法 - 你不能加載32位和64位元素。

我知道這個答案可能有點晚了,但前段時間我遇到了同樣的問題(在64位機器上將32位dll加載到AnyCPU程序集中)。

作為解決方案,我編寫了LegacyWrapper 它基本上由一個32位的包裝器exe加載所需的dll,通過命名管道與您的應用程序通信。

一個電話看起來像這樣:

// Define delegate matching api function
private delegate int GetSystemMetrics(int index);

// Create new WrapperClient
// Remember to ensure a call to the Dispose()-Method!
using (var client = new WrapperClient())
{
    // Make calls providing library name, function name, and parameters
    int x = (int)client.Invoke<GetSystemMetrics>("User32.dll", "GetSystemMetrics", new object[] { 0 });
    int y = (int)client.Invoke<GetSystemMetrics>("User32.dll", "GetSystemMetrics", new object[] { 1 });
}

有關詳細信息,請參閱此博客文章

編輯: 從版本2.1開始,LegacyWrapper還支持從32位進程加載64位DLL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM