【发布时间】:2011-01-29 17:32:48
【问题描述】:
我的项目是在 MFC 中开发的,它是非管理代码。现在我需要通过重用大部分 MFC 类,在 C# 中创建一个类似的应用程序。
是否可以直接从 MFC dll 中导出类/结构/枚举,以便我可以使用 dllimport 在我的 C# 中导入并使用它。?
【问题讨论】:
标签: c# dll mfc unmanaged managed
我的项目是在 MFC 中开发的,它是非管理代码。现在我需要通过重用大部分 MFC 类,在 C# 中创建一个类似的应用程序。
是否可以直接从 MFC dll 中导出类/结构/枚举,以便我可以使用 dllimport 在我的 C# 中导入并使用它。?
【问题讨论】:
标签: c# dll mfc unmanaged managed
是的,很有可能。您只需要注意类型。许多翻译得很好,但有些很古怪。
您要搜索的概念名称是 COM interop。请参阅此处获取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 或原始 C/C++ 中创建一个 COM“包装器”DLL,它将 MFC DLL 导入到标准的、pre-COM 方式,然后公开您需要的对象和方法。
【讨论】:
您不能 [DllImport] MFC 类,它仅适用于静态函数。将它们变成 COM coclass 仅在技术上是可行的,手术很重要。最好的方法是用 C++/CLI 语言编写托管类包装器。您将为每个 MFC 类编写一个 ref 类。它存储了一个指向MFC类对象的指针,每个方法直接调用对应的MFC类方法。在绝大多数情况下,这只是一行代码。
这是一个非常机械的过程,您可以use SWIG 为您完成这项工作。不知道好不好,自己没用过。
关于 C++/CLI 和包装器方法的不错的教程是 available here。
【讨论】: