Marshal结构到非托管数组

时间:2010-03-31 10:29:09

标签: c# c pinvoke marshalling

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

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

    //Some properties/methods
}

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

非托管C签名类似于

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

我手边没有编译器,但我想知道你是否可以使用

之类的东西
[MarshalAs(...)]
[StructLayout(LayoutKind::Sequential, Pack=1)]
public struct Vector  
{  
    private double x;  
    private double y;  
    private double z;  

    //Some properties/methods
}

请参阅herehere以及here