【问题标题】:Marshal struct to unmanaged array将结构封送到非托管数组
【发布时间】:2010-03-31 10:29:09
【问题描述】:

我有一个 C# 结构来表示笛卡尔向量,如下所示:

public struct Vector  
{  
    private double x;  
    private double y;  
    private double z;  

    //Some properties/methods
}

现在我有一个需要使用 P/Invoke 调用的非托管 C dll。有些方法需要一个 double[3] 参数。

非托管 C 签名类似于

void Cross(double a[3], double b[3], double c[3]);  

有什么方法可以设置 P/Invoke 签名,以便我可以传递 Vector 结构的实例并将它们透明地编组到非托管双精度 [3]?我还需要双向编组,因为非托管函数需要将输出写入参数数组,所以我想我需要编组为 LpArray。

【问题讨论】:

    标签: c# c pinvoke marshalling


    【解决方案1】:

    您可以在您的 P/Invoke 声明中说谎,成员将在所有当前 CPU 架构上正确对齐,以便在非托管代码中作为数组读取:

    [DllImport("blah.dll")]
    private static extern void Cross(ref Vector a, ref Vector b, ref Vector c);
    

    【讨论】:

      【解决方案2】:

      我手头没有编译器,但我想知道你是否可以使用类似的东西

      [MarshalAs(...)]
      [StructLayout(LayoutKind::Sequential, Pack=1)]
      public struct Vector  
      {  
          private double x;  
          private double y;  
          private double z;  
      
          //Some properties/methods
      }
      

      hereherehere

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-26
        • 2012-04-13
        • 2011-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        相关资源
        最近更新 更多