![](/img/trans.png)
[英]Will dll be loaded as 32bit or 64bit when exe is x86(32bit) on a 64bit machine?
[英]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 });
}
有關詳細信息,請參閱此博客文章 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.