2012-02-08 90 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