如何将C/C++结构转换为C#

本文关键字:结构 转换 C++ | 更新日期: 2023-09-27 18:25:29

我想为程序编写一个插件。该程序只能使用C/C++*.dll库。不过,我想用C#编写我的插件,所以我想我可以通过COM从C++dll调用我的C#函数。这很好,但现在我需要访问原始程序提供的结构。在C++中,这个结构看起来像这样:

struct asdf{
char            mc[64];
double          md[10];
unsigned char   muc[5];
unsigned char   muc0 : 1;
unsigned char   muc1 : 1;
unsigned char   muc2 : 6;
unsigned char   muc3;
another_struct st;
};

为了能够将该结构作为参数传递给C#,我尝试在C#中构建完全相同的结构。我尝试了以下操作,但它给了我一个访问违规:

struct asdf{
char[]            mc;
double[]          md;
byte[]   muc;
byte   muc0;
byte   muc1;
byte   muc2;
byte   muc3;
another_struct st;
};

我需要改变什么?

如何将C/C++结构转换为C#

如果希望数组内联,则需要使用固定大小的缓冲区。我假设char是一个字节。处理muc0muc1等的代码将需要一些自定义属性。你对待整件事就像对待byte

struct asdf
{
    public fixed byte    mc[64];
    public fixed double  md[10];
    public fixed byte    muc[5];
    private byte         mucbyte;
    // These properties extract muc0, muc1, and muc2
    public byte muc0 { get { return (byte)(mucbyte & 0x01); } }
    public byte muc1 { get { return (byte)((mucbyte >> 1) & 1); } }
    public byte muc2 { get { return (byte)((mucbyte >> 2) & 0x3f); } }
    public byte muc3;
    public another_struct st;
};

我会稍微更改一下,使用一个字符串,并确保在程序中使用结构时,将数组初始化为与C++代码中使用的大小相同的大小。

struct asdf{
string            mc;
double[]          md;
byte[]            muc;
byte              muc0;
byte              muc1;
byte              muc2;
byte              muc3;
};