我有一个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();
答案 0 :(得分:4)
/clr
编译器选项编译C ++ DLL。public ref class
语法编写托管类,并在此类中指向您的本机类。公开此托管类中的所有方法,并将转发所有对本机类的调用。您需要使用/clr
标志编译少量源文件,而不是全部。让所有本机源文件都编译为本机。您的DLL将链接到VC运行时DLL以及.NET运行时DLL。
托管类有很多,/clr
,互操作性/编组,但至少要开始使用。
您可以从here
中选择自己喜欢的文章答案 1 :(得分:2)
你必须用C ++编写一个包装器(可能是托管C ++),你可以在其中调用C ++ clasess并公开可以从.Net调用的flat dll函数,或者.Net类(如果你使用的话)托管C ++),可以从.Net访问。