假设以下内容:
让我们拥有一个C ++类:
class ExampleClass
{
private:
int var1;
public:
void DoSomething();
}
假设还要遵循我们想通过.NET Core应用程序使用PInvoke或使用EmitCalli调用的C ++函数:
extern "C" ExampleClass CreateObject()
因此C ++函数按值返回ExampleClass的实例。有没有办法以字节数组的形式在托管部分上获取此实例(假设ExampleClass的大小已知)。
我记得,在大多数本机x86(x64)调用约定中,有效返回结构的C ++函数都具有指向要填充的结构的指针作为参数之一。 NET Core是否可以使用此提示:在托管部分分配字节数组,并将指针作为第一个参数传递给非托管调用?
谢谢!
答案 0 :(得分:1)
在C ++中
ExampleClass CreateClass();
将返回sizeof(ExampleClass)
的字节块,并且在没有虚拟成员和继承的情况下,它将是普通对象,并且等同于相同的结构定义(有关更多信息,请参见Structure of a C++ Object in Memory Vs a Struct)
P /调用编组器应该能够毫无问题地处理此问题。
它不是IntPtr,而是C和C ++的实际内存块。 相当于IntPtr是
ExampleClass * CreateClass();
我不确定为什么它返回实例而不是指针,但是它们可能有其原因。
所以如果您定义它
public struct ExampleClass
{
public int Var1;
}
您应该没事(除非类结构更复杂,否则您需要检查C ++编译中的布局是什么,特别是填充。例如,具有2个bool
的类在某些填充中的大小为16)
在此处查看更多信息: