2010-03-20 118 views
6

我有我的项目是在MFC中开发的,它是免费代码。现在我需要通过重用大多数MFC类在C#中创建一个类似的应用程序。使用托管代码中的非托管代码

是否有可能从MFC dll直接导出class/struct/enum,以便我可以使用dllimport将其导入到C#中并使用它。

回答

5

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

您正在搜索的概念的名称是COM互操作。在这里看到一个getting started tutorial.当然,MFC DLL必须支持COM可以从.NET访问。您需要使用适当的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或创建一个COM“包装” DLL原始的C/C++,它将以标准,COM前导方式导入MFC DLL,然后公开你需要的对象和方法。

+0

非常感谢您的信息。 对我来说,问题是,我无法添加对“创建教程”中提到的MFC dll的引用。它说,该DLL不是一个有效的COM组件。 – Harsha 2010-03-20 05:03:24

+0

啊,好的。在这种情况下,您必须重新生成MFC DLL并使它们可用于COM,如果认为这意味着打开构建的自动化标志(MFC已经使用了很多年了)。当您重新生成MFC时,DLL将使COM-可访问的接口准备在.NET中使用 – 2010-03-20 05:13:49

+0

@Harsha:我将som COM Automation信息添加到原始答案的正文中。再看看。 – 2010-03-20 05:19:38

3

你不能[DllImport] MFC类,它只适用于静态函数。把它们变成COM coclasses在技术上是可行的,手术是主要的。做到这一点的最好方法是用C++/CLI语言编写托管类包装器。你会为每个MFC类编写一个ref类。它存储一个指向MFC类对象的指针,每个方法直接调用相应的MFC类方法。在绝大多数情况下,这是一行代码。

这是一个很机械的过程,你可以use SWIG为你做这个工作。不知道它有多好,从来没有用过它。

C++/CLI和封装器方法的一个体面的教程是available here