c#调用native dll - struct marshaling

时间:2014-10-02 10:23:47

标签: c# pinvoke marshalling dllimport

我试图调用此c dll函数

long foo (long l2, long l2, char *c, MYSTRUCT *mystruct);

需要这个结构:

typedef struct {
    bool b;
    short s;
    double d1;
    double d2;
    double d3;
} MYSTRUCT;

现在,这应该非常简单。我确实喜欢这个:

[StructLayout(LayoutKind.Sequential)]
public struct MYCSSTRUCT
{
    [MarshalAs(UnmanagedType.I1)]
    public bool b;
    public Int16 s;
    public double d1;
    public double d2;
    public double d3;
}

并且调用了这样的函数:

    [DllImport("my.dll", CallingConvention = CallingConvention.StdCall, SetLastError = false)]
    public static extern Int32 foo(Int32 l1, Int32 l2, string c, ref MYCSSTRUCT mycsstruct);

但是,最后,dll正确接收了除d1,d2和d3之外的所有值。而且我不知道哪里出现错误。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您的bool字段可能导致错误。问题是bool大小 - 它在c#和c ++中是不一样的。 阅读this有关该文章的文章。

尝试使用int字段而不是布尔值。

答案 1 :(得分:0)

谢谢,但我终于找到了自己。

我错过了c struc所在的指令块,用

定义
#pragma pack (2)

所以,我刚修改了我的c#struct定义,如下所示:

[StructLayout(LayoutKind.Sequential, Pack = 2)]
public struct MYCSSTRUCT
{
    [MarshalAs(UnmanagedType.I1)]
    public bool b;
    public Int16 s;
    public double d1;
    public double d2;
    public double d3;
}

游戏完成。