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的大小)。 请参阅此处的更多信息: