从64位exe访问32位DLL的方法

我有一个项目必须编译并以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("User32.dll", "GetSystemMetrics", new object[] { 0 }); int y = (int)client.Invoke("User32.dll", "GetSystemMetrics", new object[] { 1 }); } 

有关详细信息,请参阅此博客文章 。

编辑: 从版本2.1开始,LegacyWrapper还支持从32位进程加载64位DLL。