Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从64位exe访问32位DLL的方法_C#_.net_Visual Studio 2010 - Fatal编程技术网

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

C# 从64位exe访问32位DLL的方法,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,我有一个项目,必须在64位模式下编译和运行。不幸的是,我需要调用一个仅在32位模式下可用的DLL,所以我不可能在1 Visual Studio项目中容纳所有内容。我正在努力寻找最好的方法,将32位DLL封装在自己的exe/服务中,并从我的64位应用程序对该exe/服务发出远程(尽管在同一台机器上)调用。我的操作系统是Win7 Pro 64位 对这个32位进程所需的调用是每秒几十次,但数据量很低。这是一个实时图像分析应用程序,因此尽管体积较小,但响应时间非常关键。大量发送/接收单个原语 理想情况下

我有一个项目,必须在64位模式下编译和运行。不幸的是,我需要调用一个仅在32位模式下可用的DLL,所以我不可能在1 Visual Studio项目中容纳所有内容。我正在努力寻找最好的方法,将32位DLL封装在自己的exe/服务中,并从我的64位应用程序对该exe/服务发出远程(尽管在同一台机器上)调用。我的操作系统是Win7 Pro 64位

对这个32位进程所需的调用是每秒几十次,但数据量很低。这是一个实时图像分析应用程序,因此尽管体积较小,但响应时间非常关键。大量发送/接收单个原语

理想情况下,我会托管一个WCF服务来容纳这个DLL,但在64位操作系统中,不能强制该服务以x86!的形式运行。这真的很不幸,因为在我的机器上,我对WCF服务的函数调用的时间仅为4ms

我用命名管道is.net进行了实验。我发现它们比WCF慢40-50倍(我无法使用)


关于如何解决我的难题的最佳方法,还有其他选择或建议吗?

无。指向64位进程中的32位dll=不可用

我要做的是运行一个32位的包装器进程,并使用WCF与之通信——就像您所做的那样。我可以强制操作系统运行32位

我有一个核心库(Tradex.Connectivity.core),带有与平台无关的.NET代码。我有两个包装器(Wrapper32.exe,Wapper64.exe),它们启动并加载独立代码,然后加载类(托管C++)。工作起来很有魅力


对我来说,这几乎是唯一的方法——你不能crss加载32位和64位元素。

正如你正确地指出的,在同一个过程中,没有办法混合位。您的32位部件需要一个单独的进程

我认为托管WCF服务是正确的选择。您的链接仅讨论wcfsvchost。我很确定你可以创建自己的Windows服务,并在32位上托管WCF服务

请参阅此链接:。您可以在任何托管应用程序(包括Windows服务)中托管您的服务,并在您喜欢的位下运行它

假设您刚刚创建了一个名为MyService的新服务,并且appipate配置已添加到app.config中,则这是在应用程序中自托管WCF服务所需的代码量:

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

上面的程序也可以运行,如果您将其显式编译为32位或64位。

我知道这个答案可能有点晚,但不久前我遇到了完全相同的问题(将32位dll加载到64位机器上的AnyCPU程序集中)

作为一个解决方案,我写了。它基本上由一个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 });
}
//定义委托匹配api函数
私有委托int GetSystemMetrics(int索引);
//创建新的包装器客户端
//记住要确保调用Dispose()-方法!
使用(var client=new WrapperClient())
{
//调用提供库名、函数名和参数的函数
intx=(int)client.Invoke(“User32.dll”,“GetSystemMetrics”,新对象[]{0});
int y=(int)client.Invoke(“User32.dll”,“GetSystemMetrics”,新对象[]{1});
}
有关详细信息,请参阅此


编辑:

“我所做的是运行一个32位包装器进程,并使用WCF与之通信-就像您所做的那样。我可以强制操作系统运行32位。”您是如何让WCF服务在64位操作系统上以32位模式运行的?将平台目标设置为x86会引发BadImageFormatException,而我一直无法研究解决这个问题的方法。为什么我会在意?我的意思是,WCF是基于网络的。一旦这些东西被序列化,就不再有32位或64位模式了。哦,我自己托管-没有wcfsvdhost,我在我的exe中启动自己的托管。只有几行代码。感谢TomTom,我不知道您可以在WCF模板项目之外自行托管WCF元素。既然你问了“我为什么在乎?”我必须指出,我实际上无法编译一个32位WCF模板项目来包装一个32位DLL。不过,只需使用模板,自托管就可以了。再次感谢。你能详细说明一下吗?我知道我可以创建一个32位Windows服务,我如何创建一个WCF服务来为我的32位Windows服务执行I/O?谢谢!我不知道您可以从应用程序手动托管WCF服务。这是一个比我认为最终使用的解决方案好得多的解决方案。为了防止您遇到安全问题,这里有一个链接:有关从64位应用程序访问32位DLL的更全面的技术列表,请参阅。