我试图调用此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之外的所有值。而且我不知道哪里出现错误。任何建议都将不胜感激。
答案 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;
}
游戏完成。