在带有.Net 2.0的64位应用程序中使用32位DLL

本文关键字:应用程序 DLL 32位 64位 Net | 更新日期: 2023-09-27 18:24:35

我需要使用外部公司的COM-DLL(因此我没有源代码),它只能与编译选项CPU Target x86一起使用。

但我的程序是一个"任意CPU"程序,我不想改变这一点。

所以我阅读并搜索了很多,发现我需要两个与IPC和WCF通信的进程。

问题:WCF在.Net Framework 2.0中不可用。

那么,在不更改主程序的CPU目标的情况下,最好、最简单的方法是什么呢?

在带有.Net 2.0的64位应用程序中使用32位DLL

如果您有一个x86目标dll,无论是.Net程序集还是本机dll,则必须在32位进程中承载此dll-在.Net的情况下,这意味着选择x86平台,否则您的dll将无法在64位计算机上加载。

如果在可能的情况下绝对必须有一个64位进程,那么使用该dll的唯一真正方法是创建一个外部32位进程,该进程"托管"dll,并通过IPC(进程间通信)与主64位进程通信。WCF只是进程之间通信的一种方法-它在.Net 2.0中不可用,但您仍然可以使用其他方法,如.Net远程处理。

请参阅C#(.NET 2.0)中Windows的进程间通信

然而,所有这些实现和维护都将是一件痛苦的事情——除非你有非常的充分理由,否则就用x86平台编译你的应用程序,至少在外部公司发布64位版本之前是这样。

如果不想将程序集更改为"x86",则需要使用某种形式的IPC,WCF只是其中之一。另一个选项是使用命名管道在两个进程之间进行通信。

过去,我总是为COM和C++DLL编写.NET包装器,并将其放置在自己的类库中。

包装器可以处理对dll的所有互操作调用。

它还允许您执行对双方(您的NET应用程序和COM DLL)都有意义的数据转换和错误报告。

我认为这应该能解决你的问题。

编辑

事实上,我已经对此进行了进一步的思考,上面的过程是行不通的。这是因为X86、x64和安腾目标处理器有着根本的不同。

编辑x64能够运行x86目标代码,安腾(使用了模拟器,现在扩展为EM64T)也可以运行

这里有更多信息

不过,您可以在一个单独的进程中运行x86 dll,并在它们之间实现某种形式的通信。我想这就是你提到WCF的原因。我这么说是因为x86软件应该在x64系统上运行。

这意味着您的解决方案将有两个可执行文件——一个x86和一个AnyCPU,因为一个程序集只能针对一种CPU类型。