对c#中的c结构进行编组

本文关键字:结构 中的 | 更新日期: 2023-09-27 18:23:37

我有一个'C'DLL',它可以将结构作为输入,我必须从我的C#程序中调用该DLL

休耕是我在c中的示例结构,我必须在我的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结构的等效C#结构是什么

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

对c#中的c结构进行编组

(改写我的原始答案)

你需要在每个结构的顶部都有这个:

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

注意CharSet命名参数。这很重要,否则您将使用wchar_t数组而不是char数组。

很难说,因为你不知道它是否有效!无论如何,它在我看来是正确的。

我的建议是简单地测试一下你在这里展示的结构,确保它看起来像你预期的那样运行。然后开始创建其他100个左右的结构。

如果有帮助的话,可以看看将C++结构数组Marshal到C#中以及其中的链接。