使用托管代码中的非托管代码

时间:2010-03-20 04:41:49

标签: c# dll mfc unmanaged managed

我的项目是在MFC中开发的,这是一个未经编码的代码。现在我需要在C#中创建一个类似的应用程序,重用大多数MFC类。

是否可以直接从MFC dll导出class / struct / enum,这样我就可以使用dllimport在我的C#中导入它并使用它。?

2 个答案:

答案 0 :(得分:5)

是的,很有可能。你只需要小心这些类型。许多翻译非常好,但有些是古怪的。

您要搜索的概念的名称是COM互操作。请参阅此处获取getting started tutorial.当然,MFC DLL必须支持可从.NET访问COM。您需要使用支持的适当COM接口重建MFC DLL。

这是一个MSDN overview of COM Automation完整版,其中包含示例项目的链接。

这里有一个simple but to-the-point CodeProject sample,它可以准确地演示如何在.NET程序集中使用COM DLL。

很棒pinvoke reference here.也适用于访问原生Win32 API。

编辑:另一个想法

如果您无法重建MFC DLL(您没有IDE的源版本或正确版本),您可以在MFC或原始C / C ++中创建COM“包装器”DLL,它将导入MFC DLL标准的,前COM方式,然后公开您需要的对象和方法。

答案 1 :(得分:3)

你不能[DllImport] MFC类,它只适用于静态函数。将它们变成COM coclass只是技术上可行,手术很重要。执行此操作的最佳方法是使用C ++ / CLI语言编写托管类包装器。您将为每个MFC类编写一个ref类。它存储一个指向MFC类对象的指针,每个方法直接调用相应的MFC类方法。在绝大多数情况下,这是一行代码。

这是一个非常机械化的过程,您可以use SWIG为您完成这项工作。不确定它有多好,从不自己使用它。

关于C ++ / CLI的体面教程和包装器方法是available here