我在写一个正在接收复杂数据结构的UDP客户端。 我确实有C++中的结构,但我的程序是C#如何将C++从C++迁移到C#
Bitfiels和联盟有很多不同的结构。
有什么办法可以不用手工转换结构?
还有一种简单的方法来实现C#中的位域和联合?
现在我正在使用Bitfields的属性,但这是一些困难的工作,具有很大的错误可能性。
我提供了一个简化的例子,我现在正在做的事情是,每个代码有大约50个结构,每行代码100行。
实施例C++:
typedef struct Message_s
{
unsigned char var : 2;
unsigned char var2 : 6;
union
{
struct
{
unsigned char sVar;
unsigned char sVar2;
}
char arr[32];
}
}Message_t;
例C#:
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
struct Message_s
{
private byte Field1
public byte var
{
get
{
return (byte)(Field1 & 0x03);
}
set
{
Field1 = (byte)((Field1 & ~0x03) | value);
}
public byte var2
{
get
{
return (byte)(Field1 & 0xFC);
}
set
{
Field1 = (byte)((Field1 & 0x03) | value<<2);
}
}
//unions may be possible with properties...
}
关于操纵位域,你可能想看看System.Collections.Specialized.BitVector32。另外,根据你在做什么,你可能想看看使用适当宽度的枚举并用Flags属性装饰它。 – JamieSee
好的如何:我写一个混合所有结构的可变C++ DLL,这将允许我从C#访问它们,不是吗? 此外,另一个问题是,C++编译器保持结构的字节和位顺序? –
不幸的是,@ChristianElsner,我有同样的想法,这似乎并没有工作。这些结构体编译,但他们的成员不能从C#访问。通过用'value class'替换'struct',你可以使它成为一个托管结构体,但是你会为位域和联合体产生编译器错误。 – karaken12