首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET Framework >

C# 使用Union遇到的一个有关问题

2012-02-26 
C# 使用Union遇到的一个问题。我在使用联合时,发现问题如下:情况1:[StructLayout(LayoutKind.Explicit, Siz

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中试试.

热点排行