2

我想为程序编写一个插件。该程序只能使用 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;
};

我必须改变什么?

4

2 回答 2

2

如果要内联数组,则需要使用固定大小的缓冲区。我假设 Cchar是一个字节。处理muc0,muc1等的代码将需要一些自定义属性。你把整个事情当作一个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;
};
于 2013-07-30T19:57:42.337 回答
0

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

struct asdf{
string            mc;
double[]          md;

byte[]            muc;

byte              muc0;
byte              muc1;
byte              muc2;
byte              muc3;
};
于 2013-07-30T18:35:39.237 回答