【问题标题】:Using unmanaged code from managed code使用托管代码中的非托管代码
【发布时间】:2011-01-29 17:32:48
【问题描述】:

我的项目是在 MFC 中开发的,它是非管理代码。现在我需要通过重用大部分 MFC 类,在 C# 中创建一个类似的应用程序。

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

【问题讨论】:

    标签: c# dll mfc unmanaged managed


    【解决方案1】:

    是的,很有可能。您只需要注意类型。许多翻译得很好,但有些很古怪。

    您要搜索的概念名称是 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 方式,然后公开您需要的对象和方法。

    【讨论】:

    • 非常感谢您提供的信息。我的问题是,我无法添加对我在“入门教程”中提到的创建的 MFC dll 的引用。它说,该 dll 不是有效的 COM 组件。
    • 啊,好的。在这种情况下,你必须重建你的 MFC DLL 并使它们 COM 可用,如果认为这意味着打开构建的自动化标志(对我来说,MFC 已经很多年了。)当你重建你的 MFC DLL 将有 COM-可在 .NET 中使用的可访问接口
    • @Harsha:我将 som COM 自动化信息添加到原始答案的正文中。再看看。
    • 当然也可以通过混合模式 C++ 程序集来实现,然后您可以从 C# dll 调用它,从而避免整个 COM 的事情?几年前我已经这样做了,但我没有调用 MFC,所以也许这个想法不会成功。自 VS2005 以来,混合模式可能已经向前发展或发生了一些变化?
    【解决方案2】:

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

    这是一个非常机械的过程,您可以use SWIG 为您完成这项工作。不知道好不好,自己没用过。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 2013-08-24
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 2013-12-29
      相关资源
      最近更新 更多