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
{
	UInt16	m_wMarket;			// 股票市场类型
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
	byte[]	m_szLabel;	// 股票代码,以'\0'结尾
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
	byte[]	m_szName;		// 股票名称,以'\0'结尾
	float	m_fLastClose;			// 昨收
	float	m_fOpen;			// 今开
	float	m_fHigh;			// 最高
	float	m_fLow;				// 最低
	float	m_fNewPrice;			// 最新
	float	m_fVolume;			// 成交量
	float	m_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
{
     UInt16	m_cbSize;									// 结构大小
     long m_time;										// 交易时间
     UInt16	m_wMarket;									// 股票市场类型
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
     byte[]	m_szLabel;					// 股票代码,以'\0'结尾
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
     byte[]	m_szName;						// 股票名称,以'\0'结尾	
     float	m_fLastClose;								// 昨收
     float	m_fOpen;									// 今开
     float	m_fHigh;									// 最高
     float	m_fLow;										// 最低
     float	m_fNewPrice;								// 最新
     float	m_fVolume;									// 成交量
     float	m_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
     float	m_fBuyPrice4;								// 申买价4
     float	m_fBuyVolume4;								// 申买量4
     float	m_fSellPrice4;								// 申卖价4
     float	m_fSellVolume4;								// 申卖量4
};
请问问题出在哪?
------解决方案--------------------完全不懂,up
不知道这个指针能对应到类对象
------解决方案--------------------不是很了解,胡说几句
.net中所有数组为引用类型,不是值类型,把所有数组改为IntPtr是否可行,用时使用Marshal.Copy对指针进行操作不知是否可行,void*是否也可用IntPtr代替。没有什么实践经验随便说说,不对的话就算了。
------解决方案--------------------以上是一段C++代码,其中的Void   *怎么翻译成C#呢?
可以用 IntPtr
另外,实际上Union在内存里只占里面一个变量的地址空间
所以其实你要用哪个就翻译哪个就好了
------解决方案--------------------