Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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++方面,我有以下类声明: class MyClass { ...fields MyClass(); ~MyClass(); };_C#_Interop_Pinvoke - Fatal编程技术网

C# 编组C++;类作为结构 在C++方面,我有以下类声明: class MyClass { ...fields MyClass(); ~MyClass(); };

C# 编组C++;类作为结构 在C++方面,我有以下类声明: class MyClass { ...fields MyClass(); ~MyClass(); };,c#,interop,pinvoke,C#,Interop,Pinvoke,此类用于dll中的某些方法。它传给他们,又从他们那里回来。 我如何用C#表示它?我需要用C++ DLL使它完全兼容。 这个类没有方法,只定义了无参数构造函数和析构函数。有什么办法可以解决这个问题吗?不幸的是,我不能使用C++\CLI,但我希望可以用C#实现 P>我只有一个想法是把它表示为C端的一个结构(不幸的是,我没有访问C++代码),并尝试使用MalSal.pTrtoStand。但我不确定它是否会起作用 有什么建议吗?谢谢。这在C#中是不可能的。它可以在托管和本机之间映射数据片段,但不能映射

此类用于dll中的某些方法。它传给他们,又从他们那里回来。 我如何用C#表示它?我需要用C++ DLL使它完全兼容。 这个类没有方法,只定义了无参数构造函数和析构函数。有什么办法可以解决这个问题吗?不幸的是,我不能使用C++\CLI,但我希望可以用C#实现

<> P>我只有一个想法是把它表示为C端的一个结构(不幸的是,我没有访问C++代码),并尝试使用MalSal.pTrtoStand。但我不确定它是否会起作用


有什么建议吗?谢谢。

这在C#中是不可能的。它可以在托管和本机之间映射数据片段,但不能映射行为。C++类本身就提供了行为,因此不能直接编组。 不过,您可以做的是将
IntPtr
封送到本机对象,并创建一个瘦PInvoke层,该层仅使用
IntPtr
访问类型上的数据片段。例如,让我说我有下面的C++类。
class MyClass {
public:
  int Field;
};
我可以用下面的一组C函数公开它的行为

extern "C" {

  void* MyClass_Create() {
    return new MyClass();
  }

  void MyClass_Delete(void* pValue) {
    delete reinterpret_cast<MyClass*>(pValue);
  }

  int MyClass_GetField(void* pValue) {
    return reinterpret_cast<MyClass*>(pValue)->Field;
  }

  void MyClass_SetField(void* pValue, int field) {
    reinterpret_cast<MyClass*>(pValue)->Field = field;
  }
}

这在C#中是不可能的。它可以在托管和本机之间映射数据片段,但不能映射行为。C++类本身就提供了行为,因此不能直接编组。 不过,您可以做的是将
IntPtr
封送到本机对象,并创建一个瘦PInvoke层,该层仅使用
IntPtr
访问类型上的数据片段。例如,让我说我有下面的C++类。
class MyClass {
public:
  int Field;
};
我可以用下面的一组C函数公开它的行为

extern "C" {

  void* MyClass_Create() {
    return new MyClass();
  }

  void MyClass_Delete(void* pValue) {
    delete reinterpret_cast<MyClass*>(pValue);
  }

  int MyClass_GetField(void* pValue) {
    return reinterpret_cast<MyClass*>(pValue)->Field;
  }

  void MyClass_SetField(void* pValue, int field) {
    reinterpret_cast<MyClass*>(pValue)->Field = field;
  }
}

那么这个类只用于它的字段?身份不重要吗?析构函数是做什么的?你可以用Marshal.PtrToStructure进行marshall,用属性和析构函数定义类,析构函数:
[StructLayout(LayoutKind.Sequential)]公共类MyClass{…fields MyClass();~MyClass();}
@pistipanko,非常感谢!我会试试。@svick是的,它被当作一个结构。构造函数用默认值初始化字段,析构函数为空。这是不可能的,C#无法创建类的实例,也无法销毁它。非托管内存分配器、对象的大小和构造函数和析构函数的地址是C++编译器中无法在C语言中获得的实现细节。需要C++/CLI包装器。或者可以通过COM公开C++类,所以类只用于它的字段?身份不重要吗?析构函数是做什么的?你可以用Marshal.PtrToStructure进行marshall,用属性和析构函数定义类,析构函数:
[StructLayout(LayoutKind.Sequential)]公共类MyClass{…fields MyClass();~MyClass();}
@pistipanko,非常感谢!我会试试。@svick是的,它被当作一个结构。构造函数用默认值初始化字段,析构函数为空。这是不可能的,C#无法创建类的实例,也无法销毁它。非托管内存分配器、对象的大小和构造函数和析构函数的地址是C++编译器中无法在C语言中获得的实现细节。需要C++/CLI包装器。或者可以通过COM公开C++类。所有的非纯虚和非模板方法都被导出,因为它们也必须从C++本地代码中使用,所以,你可以使用C++调用的Cube约定调用它们。你不必用C风格的方法来包装它们。所有的非纯虚拟和非模板方法都被导出,因为它们也必须从C++本地代码中使用,所以你可以使用这个调用的调用约定从C++调用它们。您不必用c风格的方法包装它们。