【发布时间】:2017-04-29 01:01:10
【问题描述】:
如何将此结构/联合从 C++ 代码转换为我的 C#-UWP 代码?重要的是,逻辑和引用不会改变,因为这个结构必须发送到服务器。
与本文的区别(Convert C++ struct to C#)
- 我的结构中有非原始数据类型(作为另一个结构和 long[])
- 我的结构中有联合
typedef struct _HEADER
{
_HEADER_TYPE HeaderType;
ULONG cc;
union
{
struct
{
LONG Protocol;
_TYPE CType;
_INFO InfoDesired; // -> that's another struct
LONG ResolutionX[MAX_]; // -> how do i initialize an array in c# with maximum size ?
LONG ResolutionY[MAX_];
} Identification;
struct
{
LONG Width;
_TYPE Type;
_INFO Info; // -> that's another struct
} Buffer;
} u;
} _HEADER, *_HEADER;
_HEADER_TYPE 是一个枚举:
public enum _HEADER_TYPE
{
_HEADER_TYPE_IDENTIFICATION,
_HEADER_TYPE_PING
}
_INFO 是一个结构体:
public struct _INFO
{
public TJ S;
public long Q;
public long R1;
}
TJ 是一个枚举:
public enum TJSAMP
{
_44,
_42
}
_TYPE 是一个枚举:
public enum _TYPE
{
_OFF
_ON
}
到目前为止我尝试过的(C# 代码):
[StructLayout(LayoutKind.Explicit,Size=TotalBytesInStruct),Serializable]
public struct _HEADER
{
[FieldOffset(0)]
public _HEADER_TYPE HeaderType;
[FieldOffset(2)]
public ulong cc;
[FieldOffset(4)]
public longProtocol;
[FieldOffset(4)]
public _TYPE CType;
[FieldOffset(4)]
public _INFO InfoDesired; // -> that's another struct
[FieldOffset(4)]
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 15)]
public long[] ResolutionX;
[FieldOffset(4)]
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 15)]
public long[] ResolutionY;
[FieldOffset(8)]
public long Width;
[FieldOffset(8)]
public _TYPE Type;
[FieldOffset(8)]
public _INFO Info; // -> that's another struct
}
这和上面的 c++ 结构完全一样吗?
【问题讨论】:
-
与stackoverflow.com/questions/10838825/… 的区别在于: - 我的结构中有非原始数据类型 - 我的结构中有联合
-
你能告诉我们,到目前为止你尝试了什么?我会使用这些链接从嵌套结构向外部结构工作:1)msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx 2)pinvoke.net
-
这应该有助于数组部分:stackoverflow.com/questions/188299/…
-
"这和上面的 c++ 结构完全一样吗?"不,因为各种原因。一,你没有正确布置它们。其次,在 C# 中,
long[]是指向数组的指针,因此它不等同于 C++ 数组。