Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C++;C中的类实例# 我有一个DLL,它包含一个继承自另一个抽象C++类的类,定义如下: class PersonInterface { public: virtual int __stdcall GetName() = 0; }; [StructLayout( LayoutKind.Sequential )] public class PersonInterface { }_C#_.net_C++_Interop - Fatal编程技术网

C# 如何使用C++;C中的类实例# 我有一个DLL,它包含一个继承自另一个抽象C++类的类,定义如下: class PersonInterface { public: virtual int __stdcall GetName() = 0; }; [StructLayout( LayoutKind.Sequential )] public class PersonInterface { }

C# 如何使用C++;C中的类实例# 我有一个DLL,它包含一个继承自另一个抽象C++类的类,定义如下: class PersonInterface { public: virtual int __stdcall GetName() = 0; }; [StructLayout( LayoutKind.Sequential )] public class PersonInterface { },c#,.net,c++,interop,C#,.net,C++,Interop,DLL导出一个可在C#中使用的函数,如下所示(以下方法是静态类PersonManager的一部分): 其中,PersonInterface在C#类中定义如下: class PersonInterface { public: virtual int __stdcall GetName() = 0; }; [StructLayout( LayoutKind.Sequential )] public class PersonInterface { } 我可以成功地检索C++类实例: Per

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

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

class PersonInterface
{
public:
    virtual int __stdcall GetName() = 0;
};
[StructLayout( LayoutKind.Sequential )]
public class PersonInterface
{
}
<>我可以成功地检索C++类实例:

PersonInterface person;
bool retrieved = PersonManager.GetPerson( out person );
但是,在调用
GetName
方法之前,检索到的对象没有任何用处

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

string name = person.GetName();

<>你必须在C++中编写一个包装器(它可以被管理C++),在这里你调用C++的CLASess,并公开了一个扁平的DLL函数,这些函数可以从.NET调用,或者.NET类(如果你使用了托管C++),它将从.NET.< /P> < UL>访问。
  • 使用<代码> /CLR < /COD>编译器选项编译您的C++ DLL。
  • 使用
    public ref class
    语法编写一个托管类,并将指针指向该类中的本机类。公开此托管类中的所有方法,并将所有调用转发到本机类
  • 将此DLL作为程序集导入c#项目,并像使用任何其他.NET类一样使用此类
  • 您只需要使用
    /clr
    标志编译少数源文件,而不是全部。将所有本机源文件编译为本机源文件。您的DLL将链接到VC运行时DLL以及.NET运行时DLL

    托管类、
    /clr
    、互操作性/编组(Marshalling)有很多,但至少要开始了


    您可以从

    这不起作用,C#类!=C++类。你必须在C++ C++语言中编写包装器,或者通过C++来公开C++。最简单的解决方案是使用普通API创建一个简单的dll,可以使用dllimports从.Net调用该dll