非托管和托管c++ DLL之间的互操作性

Interoperability between unmanaged and managed C++ DLL

本文关键字:互操作性 之间 c++ DLL      更新时间:2023-10-16

我目前有一个使用MFC的旧的非托管c++ DLL。这个DLL有一堆代码是多线程的,并在2003年使用VC6编写。遗憾的是,这段代码不再工作了。

我的任务是找到一种运行这个多线程代码的替代方法,以便它按预期工作。在我之前有人已经用c#重写了它,我需要将c#代码移植到vc++上。我做了一些研究,并意识到我可以通过将c#代码移植到vc++(使用。net框架)来节省移植过程中的一些时间。但后来我意识到,我的旧MFC DLL不能运行这个。net代码。

我的想法是在vc++ DLL中编写多线程代码(使用。net框架),并使用某种形式的互操作性,以便能够从旧的DLL调用函数到新的DLL。

我研究了COM的互操作性和包装类。实现这一目标的最佳方式是什么?有什么教程可以帮助我完成这个任务吗?(我已经做了一些广泛的搜索,有很多教程使用非托管c++ dll到c# dll,但没有多少适合我的情况)。

就像你知道的那样,我不能用/clr编译旧的DLL,因为这个DLL也托管在旧的Win32应用程序中。使用/clr编译会导致应用程序崩溃,否则这种情况早就发生了。

澄清:我很好奇,为什么通过COM互操作从非托管c++ DLL调用驻留在c# DLL中的函数,与使用托管c++ DLL做完全相同的事情相比,似乎如此简单。我甚至有一个c#和c++之间的概念验证,但我一辈子都无法开始理解用c++执行完全相同的任务。是否碰巧有一个简单的教程来调用一个简单的(让我们说'Add')函数从非托管c++到托管c++ ?

如果你有一个(托管的)DLL,不管它是用哪种语言编写的,你都需要一个进程来运行它。如果您有一个本机进程——无论出于何种原因——必须不使用CLR,那么您就不能直接从该进程中使用托管DLL(任何依赖于进程内CLR的代码)。

您将需要第二个辅助进程来运行托管的DLL,例如,公开本机进程可以调用的COM接口。(COM服务器退出进程)

我研究了COM的互操作性和包装类。实现这一目标的最佳方式是什么?

不确定包装器类是什么意思,但是为您托管的DLL提供进程外COM服务器可以做到这一点。(很明显,这是相当严重的错误。来管理helper进程的正确注册和启动/关闭。

把这个问题分解一下(据我所知):

[oldish Win32 app (no! CLR)]
      <- normal DLL interface -> [native/MFC DLL (no! CLR)] 
                                                  <- via COM -> [stuff in a separate executable]

如果这是你正在寻找的,那么这篇文章(只是一个快速的谷歌点击)可能会有所帮助:

http://www.codeproject.com/KB/COM/BuildCOMServersInDotNet.aspx

一般来说,我认为任何COM教程都应该涵盖你应该尝试做的事情。