如何转换C/C++;结构到C#
我想为一个程序写一个插件。该程序只能使用C/C++*.dll库。我想在C语言中编写我的插件,所以我认为我可以通过COM从C++ DLL调用我的C函数。这很好,但现在我需要访问原始程序提供的结构。在C++中,这个结构看起来像:如何转换C/C++;结构到C#,c#,dll,struct,interop,C#,Dll,Struct,Interop,我想为一个程序写一个插件。该程序只能使用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
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++代码中使用的相同大小。
struct asdf{
string mc;
double[] md;
byte[] muc;
byte muc0;
byte muc1;
byte muc2;
byte muc3;
};
如果希望数组内联,则需要使用。我假设C
char
是一个字节。处理muc0
、muc1
等的代码需要一些自定义属性。你把整个事情当作一个字节
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++/CLI进行互操作要容易得多;-)对于其他所有东西,看不到这一点,因为MUC0到MUC2只是C++一侧的一个字节。我不知道自动COM转换,但我确实认为,COM坚持这一点,您必须在链接问题中使用Marshallas(参见我的评论)。非常感谢我能够运行它!