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

时间:2011-11-21 14:42:16

标签: c++ dll mfc unmanaged managed

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

我的任务是找到一种运行这种多线程代码的替代方法,以便它能够按预期运行。我之前的某个人已经用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 ++执行完全相同的任务。是否恰好只是一个简单的教程,只调用一个简单的(比如说'添加')函数,从非托管C ++到托管C ++?

1 个答案:

答案 0 :(得分:0)

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

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

  

我研究过COM互操作性以及包装类。实现这个目标的最佳方法是什么?

不确定您对包装类的意思,但是托管DLL的进程外COM服务器可以解决这个问题。 (显然,这对于管理正确的注册和启动/关闭辅助进程非常有用。)

稍微解决问题(据我所知):

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

如果这是您正在寻找的内容,那么这篇文章(只需快速点击Google)可能会有所帮助:

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

对于一般的COM,我认为任何COM教程都应该涵盖你应该做的事情。