按值调用 return 对象的非托管函数

Calling an unmanaged function which return object by value

假设如下:

让我们有一个C++ class:

class ExampleClass
{
 private:
    int var1;
 public:
    void DoSomething();
}

假设还遵循我们要使用 PInvoke 或使用 EmitCalli 从 .NET Core 应用程序调用的 C++ 函数:

extern "C" ExampleClass CreateObject()

所以 C++ 按值函数 returns ExampleClass 的实例。有什么方法可以将此实例作为字节数组在托管部分上获取(假设 ExampleClass 的大小已知)。

我记得,在大多数本机 x86(x64) 调用约定中,return 结构的 C++ 函数实际上具有指向要填充的结构的指针作为参数之一。此提示是否适用于 NET Core:在托管部分分配字节数组并将指针作为第一个参数传递给非托管调用?

谢谢!

在 C++ 中

ExampleClass CreateClass();

将 return 一个 sizeof(ExampleClass) 的字节块并且在没有虚拟成员和继承的情况下它将是普通对象并且等同于相同的结构定义(在这里查看更多相关信息:Structure of a C++ Object in Memory Vs a Struct )

P/Invoke 编组器应该能够毫无问题地处理这个问题。

它不是 IntPtr,它是 C 和 C++ 的实际内存块。 IntPtr 等价物是

ExampleClass * CreateClass();

我不确定为什么它 return 是实例而不是指针,但他们可能有他们的原因。

所以如果你定义它

public struct ExampleClass
{
    public int Var1;
}

你应该没问题(除非 class 结构更复杂,你需要检查 C++ 编译中的布局,特别是填充。例如 class 和 2 bool s 可能会在某些填充中产生 16 的大小。

在此处查看更多信息: