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