如何在 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++ 类?的主要内容,如果未能解决你的问题,请参考以下文章