C# 调用按值返回对象的非托管函数

C# 调用按值返回对象的非托管函数,c#,.net-core,coreclr,C#,.net Core,Coreclr,假设如下: 让我们有一个C++类: 类示例类 { 私人: int-var1; 公众: 无效剂量(); } 也假定遵循C++函数,我们想用.pNECKE调用.NET核心应用程序,或者使用EMTCALI: extern“C”ExampleClass CreateObject() < C++函数以值返回示例类的实例。是否有任何方法可以将托管部件上的该实例作为字节数组获取(假设ExampleClass的大小已知) 我记得,在大多数本地X86(x64)调用约定中,返回结构的C++函数实际上有指向结构的

假设如下:

让我们有一个C++类:

类示例类
{
私人:
int-var1;
公众:
无效剂量();
}

也假定遵循C++函数,我们想用.pNECKE调用.NET核心应用程序,或者使用EMTCALI:

extern“C”ExampleClass CreateObject()
< C++函数以值返回示例类的实例。是否有任何方法可以将托管部件上的该实例作为字节数组获取(假设ExampleClass的大小已知)

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

谢谢

在C中++

ExampleClass CreateClass();
将返回一个字节块
sizeof(ExampleClass)
,在没有虚拟成员和继承的情况下,它将是普通对象,与相同的结构定义等效(请参阅此处的更多信息:)

p/Invoke marshaller应该能够毫无问题地处理这个问题

<>它不是一个ItpTR,它是C和C++的实际内存块。 IntPtr等价物为

ExampleClass*CreateClass();
我不确定它为什么返回实例而不是指针,但它们可能有自己的原因

所以如果你定义它

public struct ExampleClass
{
    public int Var1;
}

你应该很好(除非类结构更复杂),你需要检查C++编译中的布局,具体是填充。例如,2代码< BoOL S可以在某些填充中产生16的大小)。 请参阅此处的更多信息:


AFAIK不能使用.NET代码中的C++类。如果您想使用C类中的一个实例,一个选项可能是构建一个C++/CLI包装库,该库包含一个与ExampleClass > <代码>相同API的类,并且内部调用C++函数。不过,我不确定C++/CLI是否可以与.NET Core一起使用。