C# 使用Union遇到的一个问题。
我在使用联合时,发现问题如下:
情况1:
[StructLayout(LayoutKind.Explicit, Size = 32)]
public struct RCV_FILE_HEADEx_union
{
[FieldOffset(0)]
public UInt32 m_dwSerialNo;// 序列号,对股评
[FieldOffset(0)]
public byte m_FileTime;// 文件创建时间
}
即使2个字段长度不同也能正常执行。
情况2:
[StructLayout(LayoutKind.Explicit, Size = 144)]
public struct RCV_DATA_union
{
[FieldOffset(0)]
public RCV_REPORT_STRUCTEx m_pReport;
[FieldOffset(0)]
public RCV_REPORT_STRUCTExV2 m_pReportV2;
}
自定义的Struct在运行时出错,错误如下:未能从程序集“服务器端程序, Version=1.0.2914.26500, Culture=neutral, PublicKeyToken=null”中加载类型“RCV_DATA_union”,因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠。
附上2个自定义的结构:
public struct RCV_REPORT_STRUCTEx
{
UInt16m_wMarket;// 股票市场类型
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
byte[]m_szLabel;// 股票代码,以'\0'结尾
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
byte[]m_szName;// 股票名称,以'\0'结尾
floatm_fLastClose;// 昨收
floatm_fOpen;// 今开
floatm_fHigh;// 最高
floatm_fLow;// 最低
floatm_fNewPrice;// 最新
floatm_fVolume;// 成交量
floatm_fAmount;// 成交额
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
float[]m_fBuyPrice;// 申买价1,2,3
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
float[]m_fBuyVolume;// 申买量1,2,3
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
float[]m_fSellPrice;// 申卖价1,2,3
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
float[]m_fSellVolume;// 申卖量1,2,3
};
//////////////////////////////////////////////////////////////////////////////////
//行情数据(版本2数据结构RCV_WORK_SENDMSG)
//SIZE:144
public struct RCV_REPORT_STRUCTExV2
{
UInt16m_cbSize;// 结构大小
long m_time;// 交易时间
UInt16m_wMarket;// 股票市场类型
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
byte[]m_szLabel;// 股票代码,以'\0'结尾
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
byte[]m_szName;// 股票名称,以'\0'结尾
floatm_fLastClose;// 昨收
floatm_fOpen;// 今开
floatm_fHigh;// 最高
floatm_fLow;// 最低
floatm_fNewPrice;// 最新
floatm_fVolume;// 成交量
floatm_fAmount;// 成交额
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
float[]m_fBuyPrice;// 申买价1,2,3
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
float[]m_fBuyVolume;// 申买量1,2,3
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
float[]m_fSellPrice;// 申卖价1,2,3
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
float[]m_fSellVolume;// 申卖量1,2,3
floatm_fBuyPrice4;// 申买价4
floatm_fBuyVolume4;// 申买量4
floatm_fSellPrice4;// 申卖价4
floatm_fSellVolume4;// 申卖量4
};
请问问题出在哪?
[解决办法]
完全不懂,up
不知道这个指针能对应到类对象
[解决办法]
不是很了解,胡说几句
.net中所有数组为引用类型,不是值类型,把所有数组改为IntPtr是否可行,用时使用Marshal.Copy对指针进行操作不知是否可行,void*是否也可用IntPtr代替。没有什么实践经验随便说说,不对的话就算了。
[解决办法]
以上是一段C++代码,其中的Void *怎么翻译成C#呢?
可以用 IntPtr
另外,实际上Union在内存里只占里面一个变量的地址空间
所以其实你要用哪个就翻译哪个就好了
------解决方案--------------------
关注
[解决办法]
主要是转换数据类型时,长度要对应就OK了
[解决办法]
"所谓联合,是想用一个类型把一段存储结构用多种方式来解释,现在只有一种解释的话,就不能算是联合了。我现在读一段存储结构要读多次(每种都读一次),很不方便。而如果我实现了联合,拿到一个对象,就可以通过成员访问他的各种数据解释了。"
我明白你的意思,但是又是语言不支持,你除了这样变通还有什么办法
要不你就用C++做个 dll 让C#调用咯
[解决办法]
把你下面两个结构的定义字段完全复制到你的UNION中试试.