我正在编写一个包含大多数小型blittable结构的中型C库的包装器。
我过去曾写过几个包装器,它们有3种类型。
在C#包装器中,我们编写类型和函数签名的托管等价物。当我们调用这些托管等效函数时,Marshaller将转换参数并将本机类型的值返回到托管类型。
在C ++ / CLI瘦包装器中,我们通常使用封装的指针idiom,我们编写包含指向本机类型的指针的托管类型。 C#使用托管类型和包装器公开的API。在调用本机函数之前和之后,C ++ / CLI包装器在每次转换时手动封装和解封装值。
在C ++ / CLI胖包装器中,我们利用C ++ / CLI层可以直接操作本机类型并调用本机函数的事实,并在此处重新定位智能。这为C#客户端代码留下了更严格的API表面,代价是可能隐藏了原始库公开的某些功能。
问题:
C ++ / CLI中是否存在类似于显式P / Invoke的自动编组机制,托管类型会自动复制到本机类型并返回?
我认为如下:
显式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。
这可能吗?