【发布时间】:2012-06-21 14:26:12
【问题描述】:
我正在编写一个接收复杂数据结构的 UDP 客户端。 我确实有 C++ 中的结构,但我的程序是 C#
Bitfiels 和联合有很多不同的结构。
有什么方法可以不用手动转换结构吗?
还有在 C# 中实现位域和联合的简单方法吗?
现在我正在为位域使用属性,但这是一项艰巨的工作,极有可能出错。
我提供了一个我现在正在做的简化示例,大约有 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 属性对其进行装饰。
-
好的,这样怎么样:我编写了一个包含所有结构的管理 C++ DLL,这将允许我从 C# 访问它们,不是吗?另外,另一个问题,C++ 编译器是否保持结构的字节和位顺序?
-
不幸的是,@ChristianElsner,我有同样的想法,这似乎不起作用。这类结构可以编译,但不能从 C# 访问它们的成员。您通过将
struct替换为value class使其成为托管结构,但随后您会得到位域和联合的编译器错误。 -
是否可以使用 COM 访问您的 C++ 结构?