调用非托管函数,该函数按值返回对象

时间:2019-05-03 17:58:11

标签: c# .net-core coreclr

假设以下内容:

让我们拥有一个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是否可以使用此提示:在托管部分分配字节数组,并将指针作为第一个参数传递给非托管调用?

谢谢!

1 个答案:

答案 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)

在此处查看更多信息: