使用.Net 2.0将32位DLL用于64位应用程序

3
我需要使用一个外部公司提供的COM-DLL(没有源代码),它只能与编译选项CPU-Target x86一起使用。
但我的程序是“Any CPU”程序,我不想改变这个设置。
所以我阅读并谷歌了很多资料,发现我需要使用IPC和WCF进行通信。
问题是:.Net Framework 2.0不支持WCF。
那么,在不更改我的主程序CPU-Target的情况下,最好和最简单的方法是什么?

你为什么不能将主程序改为使用x86架构呢?毕竟,这是32位机器上将要使用的架构。 - Justin
请参阅 https://dev59.com/yW025IYBdhLWcg3w6aYX#12938217 - cdiggins
3个回答

4
如果您有一个 x86 目标 dll,无论是 .Net 程序集还是本地 dll,那么您必须将此 dll 托管在 32 位进程中 - 在 .Net 的情况下,这意味着选择 x86 平台,否则您的 dll 将无法在 64 位机器上加载。
如果您必须尽可能使用 64 位进程,则您唯一真正使用此 dll 的方法将是创建外部 32 位进程,该进程“托管” dll,并通过 IPC (进程间通信) 与您的主 64 位进程通信。WCF 只是通信进程之间的一种方法 - 它不适用于 .Net 2.0,但您仍然可以使用其他方法,例如 .Net 远程处理。
请参见C# (.NET 2.0) 中的 Windows 进程间通信 但是,除非您有一个非常好的理由,否则所有这些都将是实现和维护的痛苦,最好编译您的应用程序为 x86 平台,直到外部公司发布 64 位版本。

1

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


不,我不能将主程序更改为x86。你有.Net ->2.0<-的好例子吗?WCF只能与.Net 3.5或更高版本一起使用吗? - Tim Siefert
命名管道在.NET 2.0中也不可用。 - Hans Passant

0

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

这个包装器可以处理与dll的所有交互调用。

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

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

编辑

实际上,我进一步思考了这个问题,上述过程行不通。这是因为X86、x64和Itanium目标处理器非常不同。

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

这里有更多信息here

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

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


但是我的包装器必须使用x86编译,而我的主程序必须使用“anycpu”。如果现在我的程序使用一个类,例如“myWrapper”(x86),并且此类使用32位COM-DLL。这不起作用。我会收到一个异常,因为“AnyCPU”程序无法使用WrapperProject中的程序集。 - Tim Siefert
实际上,我已经离开并更加深入地思考了这个问题。请查看我的回复。 - ChrisBD
1
只是挑刺一下,IA64包含一个解码器,可以“模拟”x86指令,但是x64是x86的一个真正扩展,仍然能够本地运行x86代码(虽然在Windows下不与x64代码在同一进程中)。 - Justin
谢谢Jason - 我把Itanium 64位仿真和X64混淆了。 - ChrisBD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接