Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 自动编组本机可空投结构_.net_C++ Cli_Interop_Pinvoke_Marshalling - Fatal编程技术网

.net 自动编组本机可空投结构

.net 自动编组本机可空投结构,.net,c++-cli,interop,pinvoke,marshalling,.net,C++ Cli,Interop,Pinvoke,Marshalling,我正在为一个中等大小的C库编写一个包装器,其中大部分包含小型的blittable结构 我在过去写过几篇包装文章,它们有3种类型 使用P/Invoke的C包装器。 C++/CLI精简包装器。 C++/CLI fat包装器。 在C包装器中,我们编写类型和函数签名的托管等价物。当我们调用这些托管等价函数时,封送拆收器将把参数和返回值从本机类型转换为托管类型 在C++/CLI瘦包装器中,我们通常使用封装的指针习惯用法,即编写包含指向本机类型的指针的托管类型。C使用包装器公开的托管类型和API。在调用本机

我正在为一个中等大小的C库编写一个包装器,其中大部分包含小型的blittable结构

我在过去写过几篇包装文章,它们有3种类型

使用P/Invoke的C包装器。 C++/CLI精简包装器。 C++/CLI fat包装器。 在C包装器中,我们编写类型和函数签名的托管等价物。当我们调用这些托管等价函数时,封送拆收器将把参数和返回值从本机类型转换为托管类型

在C++/CLI瘦包装器中,我们通常使用封装的指针习惯用法,即编写包含指向本机类型的指针的托管类型。C使用包装器公开的托管类型和API。在调用本机函数之前和之后,C++/CLI包装器在每次转换时手动封装和解封值

在C++/CLI fat包装器中,我们利用了C++/CLI层可以直接操作本机类型和调用本机函数的事实,并将智能重新定位在这里。这为C客户机代码留下了一个更紧密的API界面,代价是可能隐藏原始库公开的一些特性

问题:

C++/CLI中是否有类似于显式p/Invoke的自动编组机制,即托管类型自动复制到本机类型并返回

我认为如下:

在C++/CLI层中,编写与小型blittable类型等效的托管类型。不仅仅是指针的容器,而是与本机结构布局相同的完整结构,基本上与我们在C中所做的相同,但使用C++/CLI语法。 有一种方法可以在调用本机函数时自动将这些类型整理为其本机等效类型。因此,我不需要调用构造函数或专用转换器。 显式p/Inovke中的Marshaller能够做到这一点,我们不能在C++/CLI中做到吗

例如,这些文件显然分散在不同的文件中:

struct NativeType
{
    int x;
    int y;
};

NativeType NativeFunction(NativeType foo)
{
    return foo;
}

public value struct ManagedType
{
public:
    int x;
    int y;
};
在我的托管C++/CLI包装器中的某个地方,我希望执行以下操作:

ManagedType ManagedFunction(ManagedType foo)
{
    return NativeFunction(foo);
}
C++/CLI将公开一个托管API,该API将薄包装本机API,而不使用样板文件


这可能吗?

常见问题。不,托管类型的布局是完全不可发现的。在编译时和运行时。如果编译器不知道布局,则无法为此生成代码,需要显式的运行时转换。一个类型是否可飞航是可以预测的,但也有一些非常不直观的情况。HansPassant中已经很好地介绍过了。@HansPassant我想让我困惑的是,CLR封送处理程序在使用C中的显式P/Invoke时完全能够做到这一点。难道我们不能在C++/CLI中实现至少相同级别的自动化吗?您可以固定托管结构并获得固定的blittable结构的地址。将其传递给本机函数。