将c ++结构转换为c#的最简单方法是什么?

时间:2013-06-19 16:29:05

标签: c# c++ pinvoke

这只是一个例子

我有一个像这样的c ++结构:

typedef struct _cdm_status {
    BYTE error_cd;
    BYTE sensor[9];  
} SDMSTATUS, *LPSDMSTATUS;

什么是c#等价物?

如何在此示例中使用它?

[DllImport("MFSSDM.dll")]
public static extern bool MFSCommSDM_Status(LPSDMSTATUS lpStatus);

3 个答案:

答案 0 :(得分:3)

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct _cdm_status {
  public Byte error_cd;
  public fixed Byte sensor[9];  
}

答案 1 :(得分:2)

public class _cdm_status
{
    public byte error_cd;
    public byte[] sensor = new byte[9];
}

C#没有typedef,因此您只需使用实际类型名称“_cdm_status”,而不是将类型称为“SDMSTATUS”。

答案 2 :(得分:1)

似乎您正在尝试转换结构,以便您可以使用p / invoke将其传递给本机函数。我会这样做:

public struct SDMSTATUS 
{
    public byte error_cd;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=9)]
    public byte sensor[];  
}

然后要声明该函数,必须确保传递一个指向struct的指针。所以像这样声明p / invoke:

[DllImport("MFSSDM.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern bool MFSCommSDM_Status(ref SDMSTATUS Status);

我假设调用约定为cdecl,但您需要替换真值。