2014-10-02 44 views
1

我想調用這個C DLL函數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

如果您使用CallingConvention.StdCall從C#中調用C函數,那麼您的c函數看起來並不是'__stdcall',運行時將無法找到它,即使它確實會損壞堆棧。 – Mgetz 2014-10-02 15:15:04

+0

嗯,實際上全功能定義是: __declspec(dllimport)long __stdcall foo(long l2,long l2,char * c,MYSTRUCT * mystruct); – Nikzeno 2014-10-02 15:34:55

回答

0

謝謝,但我終於找到了自己。

我缺少的是所在的C STRUC謊言,與

#pragma pack (2) 

定義的指令塊左右,我只是修改我的C#的結構定義如下:

[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; 
} 

遊戲完成。

1

您的bool字段可能導致錯誤。問題在於bool大小 - 它在c#和C++中不一樣。 閱讀文章this

嘗試使用int字段而不是布爾值。

+0

win32'BOOL'是一個'int',但這不是C++代碼,其中'bool'是1個字節。根據OP,它是C,在這種情況下,它是在'stdbool.h'中定義的實現 – Mgetz 2014-10-02 19:13:55