2012-02-08 120 views
1

我有一個「C」「DLL」可以採取的結構作爲輸入,我必須調用的DLL從我的C#程序編組C結構

休耕是樣品結構I具有在C,I具有在我的C#代碼中編組這些結構

是我做的是正確還是錯誤?

實際的C結構:

typedef struct procedure 
{ 
    char code[8]; 
}procedure; 


typedef struct datefield 
{ 
    char date[10]; 
}datefield; 


typedef struct p45_clsgs 
{ 
    procedure p45_clsg; 
    datefield p45_clsgdte; 
}p45_clsgs; 

C#:

[StructLayout(LayoutKind.Sequential), Serializable] 
struct procedure 
{ 
//char code[]; 
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 8)] 
public string code; 
} 
[StructLayout(LayoutKind.Sequential), Serializable] 
struct datefield 
{ 
//char date[10]; 
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 10)] 
public string date; 
} 

struct p45_clsgs 
{  
    public procedure p45_clsg; 
    public datefield p45_clsgdte; 
} 

是我的C#結構是正確的C結構?

什麼是休耕C語言結構

typedef struct p45_cldxed24 
{ 
    procedure p45_cldxed[8]; 
}p45_cldxed24; 
+0

爲什麼不測試它?... – leppie 2012-02-08 06:04:11

+0

那是一個很大的過程,我必須在c#中創建至少100個結構,所以在開始之前我想確認自己 – Raghuveer 2012-02-08 06:14:10

+0

在這種情況下最好的建議是寫每個結構體1一個,並比較C和C#中的大小。 – leppie 2012-02-08 06:27:21

回答

3

相當於C#結構(刮開我原來的答覆)

你需要在每個結構的頂部有這樣的:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 

注意CharSet命名參數。這很重要,否則你最終會得到wchar_t數組而不是char數組。

+0

是我的p45_clsgs結構是否正確? 如果是的話,如果我必須在另一個結構中聲明過程數組我該怎麼做 – Raghuveer 2012-02-08 06:38:09

+0

我說謊了,這是不正確的!我相應地更新了我的答案。你應該用一個你需要翻譯的C結構的例子來提出一個新的問題。 – Zenexer 2012-02-08 06:39:16

+0

CharSet.Ansi是關鍵。另外,Marshal.SizeOf(typeof(x))其中x是你的結構之一,應該返回正確的大小 - 分別爲8,10和18。如果沒有CharSet.Ansi,他們可能會是16,20和36. – jeffora 2012-02-08 06:44:35

0

因爲你不知道它是否正常工作,所以很難肯定地說!無論如何,它看起來對我來說是正確的。

我的建議是簡單地測試你在這裏顯示的結構,確保它看起來像你期望的那樣運行。然後開始創建其他100個左右的結構。

如果有幫助,看看Marshal C++ struct array into C#及其中的鏈接。

+0

什麼是等效C#結構休耕C語言結構 typedef結構p45_cldxed24 { 過程p45_cldxed [8 ]。 } p45_cldxed24; – Raghuveer 2012-02-08 07:12:47

+0

[鏈接](http://stackoverflow.com/questions/31854/how-to-marshal-an-array-of-structs-net-c-c) 試試這個,這是一個幫助我解決類似問題 – Ancallan 2012-02-08 07:21:25