使用托管代码调用非托管代码

6

我的项目是使用MFC编写的非托管代码。现在我需要使用C#创建一个类似的应用程序,并重用大部分MFC类。

是否可以直接从MFC dll中导出类/结构体/枚举,以便我可以使用dllimport导入它并使用它?

2个回答

5
是的,这是完全可能的。你只需要小心类型。许多翻译非常好,但有些很古怪。
你要搜索的概念名称是COM互操作性。在此处查看入门教程。当然,MFC DLL必须支持COM才能从.NET访问。你需要使用支持正确COM接口的MFC DLL重新构建它们。
这里是COM自动化的MSDN概述,包括示例项目的链接。
这里是一个简单但直截了当的CodeProject示例,演示了如何从.NET程序集中使用COM DLL。
这里有一个很棒的pinvoke参考。用于访问本地Win32 API。 编辑:另一个想法 如果您无法重建MFC DLL(没有源代码或正确版本的IDE),则可以在MFC或原始C / C ++中创建一个COM“包装器”DLL,该DLL将以标准的、预先COM方式导入MFC DLL,然后公开您需要的对象和方法。

非常感谢提供的信息。我的问题是,我无法像“入门教程”中所述那样添加对我创建的MFC DLL的引用。它说这个dll不是有效的COM组件。 - Harsha
啊,好的。在这种情况下,您必须重新构建您的MFC DLL并使它们可用于COM,如果我没记错的话,这意味着为构建打开自动化标志(对我来说已经过去很多年了)。当您重新构建您的MFC DLL时,将会有COM可访问接口准备好在.NET中使用。 - Paul Sasik
@Harsha:我在原回答的正文中添加了一些COM自动化信息。再看一下。 - Paul Sasik
当然,也可以通过混合模式的C++汇编来实现,然后从您的C# dll中调用它,从而避免整个COM的问题。我几年前就是这样做的,但我没有调用MFC,所以也许这个想法行不通。也许自VS2005以来,混合模式已经发展或变化了一些? - slugster

3
您不能使用 [DllImport] 导入 MFC 类,它仅适用于静态函数。将它们转换为 COM coclass 仅在技术上可行,手术是重要的。最好的方法是使用 C++/CLI 语言编写托管类包装器。您需要为每个 MFC 类编写 ref 类。它存储一个指向 MFC 类对象的指针,每个方法直接调用相应的 MFC 类方法。在绝大多数情况下只需一行代码。
这是一个非常机械化的过程,您可以 使用 SWIG 来完成这项工作。不确定它有多好,我自己从未使用过。
关于 C++/CLI 和包装器方法的不错教程 在这里 可以获得。

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