如何在C#中使用C ++类实例

时间:2011-08-20 09:24:51

标签: c# .net c++ interop

我有一个DLL,它包含一个继承自另一个定义如下的抽象C ++类的类:

class PersonInterface
{
public:
    virtual int __stdcall GetName() = 0;
};

DLL导出一个可以在C#中使用的函数,如下所示(以下方法是静态类PersonManager的一部分):

[DllImport( "person.dll", CallingConvention = CallingConvention.Cdecl )]
public static extern bool GetPerson( out PersonInterface person  );

其中PersonInterface在C#类中定义如下:

[StructLayout( LayoutKind.Sequential )]
public class PersonInterface
{
}

我可以像这样成功检索C ++类实例:

PersonInterface person;
bool retrieved = PersonManager.GetPerson( out person );

但是,在调用GetName方法之前,检索到的对象没有任何用处。

为了能够在检索到的人物对象上调用GetName方法,还需要做些什么?

string name = person.GetName();

2 个答案:

答案 0 :(得分:4)

  • 使用/clr编译器选项编译C ++ DLL。
  • 使用public ref class语法编写托管类,并在此类中指向您的本机类。公开此托管类中的所有方法,并将转发所有对本机类的调用。
  • 在c#项目中将此DLL作为程序集导入,并像使用任何其他.NET类一样使用此类。

您需要使用/clr标志编译少量源文件,而不是全部。让所有本机源文件都编译为本机。您的DLL将链接到VC运行时DLL以及.NET运行时DLL。

托管类有很多,/clr,互操作性/编组,但至少要开始使用。

您可以从here

中选择自己喜欢的文章

答案 1 :(得分:2)

你必须用C ++编写一个包装器(可能是托管C ++),你可以在其中调用C ++ clasess并公开可以从.Net调用的flat dll函数,或者.Net类(如果你使用的话)托管C ++),可以从.Net访问。