自然编组本机的blittable结构

时间:2015-02-07 11:21:00

标签: .net c++-cli interop pinvoke marshalling

我正在编写一个包含大多数小型blittable结构的中型C库的包装器。

我过去曾写过几个包装器,它们有3种类型。

  1. 使用P / Invoke的C#包装器。
  2. C ++ / CLI瘦包装器。
  3. C ++ / CLI fat wrapper。
  4. 在C#包装器中,我们编写类型和函数签名的托管等价物。当我们调用这些托管等效函数时,Marshaller将转换参数并将本机类型的值返回到托管类型。

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

    在C ++ / CLI胖包装器中,我们利用C ++ / CLI层可以直接操作本机类型并调用本机函数的事实,并在此处重新定位智能。这为C#客户端代码留下了更严格的API表面,代价是可能隐藏了原始库公开的某些功能。

    问题:

    C ++ / CLI中是否存在类似于显式P / Invoke的自动编组机制,托管类型会自动复制到本机类型并返回?

    我认为如下:

    1. 在C ++ / CLI层中,编写小型blittable类型的托管等效项。不仅仅是指针的容器,而是具有与本机相同布局的完整结构,基本上与我们在C#中使用C ++ / CLI语法相同。
    2. 在调用本机函数时,有办法自动将这些类型编组为其本机等效项。因此,我不需要调用构造函数或专用转换器。
    3. 显式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。

      这可能吗?

0 个答案:

没有答案