如何在 C# 代码中访问 C++ 类?

Posted

技术标签:

【中文标题】如何在 C# 代码中访问 C++ 类?【英文标题】:How to access a C++ Class in a C# code? 【发布时间】:2011-07-25 09:19:43 【问题描述】:

我有以下问题陈述。

在 dll 中导出 C++ 类(非托管)。 在 C# 代码中创建和使用此类的对象。 对于第一部分,我有 classDLL.h 如下

``

#include <iostream>
__declspec(dllexport) 
class pABC 
    private: 
      int x; 
    public: 
      void func();
;

相应的 cpp 也在那里。在编译时,我得到了 dll。对于问题的第二部分,我不知道如何继续。

谢谢。

【问题讨论】:

***.com/questions/315051/… 的副本 @unkulunkulu:这个问题已经很老了,并没有提到 C++/CLI 作为一个选项。 【参考方案1】:

您不能直接从 C# 代码访问非托管类。您可以在 C++/CLI 中编写一个小型包装器 .DLL,它将非托管类包装在 C# 可见的托管类中。

【讨论】:

当我遇到这个问题时我做了什么。轻松完成简单的事情。【参考方案2】:

将 C++ 类和 DLL 转换为 COM。如果您无权访问非托管代码源或无法修改,您可以在不同的 DLL 中实现 COM 包装器类,该 DLL 使用原始 DLL 并通过 COM 类代理原始类的功能。

在 IDL 文件中定义一个接口来表示您的 C++ 类(以及一个 coclass 声明)。在所有方法中仅使用基本 COM 类型(BSTR 用于字符串,HRESULT 用于返回代码)。作为参数传递的复杂结构应该重构到它们自己的接口中。

构建您的 COM DLL,使其输出类型库(tlb 文件)。

在您的 C++ 类中实现接口(包括 IUnknown 方法)。构建 COM DLL 并注册它。

将类型库导入您的 C# 项目。 Or use the type library importer。您现在应该能够通过“new”实例化您的 C++ 类(通过 COM)。

顺便说一句,ATL 是一个很好的框架,可以快速开始。

【讨论】:

【参考方案3】:

Google P/Invoke 或查看 www.pinvoke.net

【讨论】:

【参考方案4】:
 [DllImport("pABC.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern void func();

【讨论】:

以上是关于如何在 C# 代码中访问 C++ 类?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 导入和使用非托管 C++ 类?

如何设计应从 C++ 和 C# 访问的组件

如何从非托管 C++ 代码获取结构化列表值到 C#?

Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?

使用 COM 互操作从非托管 C++ 访问 c# 属性

如何在c#中使用C++ dll导出类[重复]