我正在尝试使用byte []字段创建类似于union的结构。因此,下一个类型声明会在运行时导致错误:
[StructLayout(LayoutKind.Explicit)]
public struct Int64ByteArr
{
[FieldOffset(0)]
public UInt64 u64;
[FieldOffset(0)]
public Int64 s64;
[FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] bytes;
}
当调用使用该类型变量的函数时,程序会导致该描述的异常:
Необработанноеисключениетипа“System.TypeLoadException”вSystem.Windows.Forms.dll Дополнительныесведения:Неудалосьзагрузитьтип “Int64ByteArr” изсборки “ChalengeCalc,版本= 1.0.0.0,文化=中性公钥=空”,таккаконсодержитполеобъектасосмещением0,котороеневерновыровненоилиперекрытополем,непредставляющимобъект
英语翻译:System.Windows.Forms.dll中类型为“System.TypeLoadException”的未处理异常 附加信息:无法从“ChalengeCalc,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”加载类型“Int64ByteArr”程序集导致它包含具有oaffset 0的对象字段,该字段未正确对齐溢出的字段一个对象
我也试试这个变种:
[StructLayout(LayoutKind.Sequential)]
public struct ByteArr8
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] bytes;
public Byte this[int idx]
{
get
{
if (idx < 0 || idx > 7) return 0;
return bytes[idx];
}
set
{
if (idx < 0 || idx > 7) return;
bytes[idx] = value;
}
}
}
[StructLayout(LayoutKind.Explicit)]
public struct Int64ByteArr
{
[FieldOffset(0)]
public UInt64 u64;
[FieldOffset(0)]
public Int64 s64;
[FieldOffset(0)]
public ByteArr8 bytes;
}
它挂起了同样的例外。所以有一个问题:“怎么样?”
答案 0 :(得分:1)
在您的特定情况下,您可以仅封送字节数组字段并为其他字段提供getter / setter:
std::basic_string<>
注意:受David Heffernan对this question的评论的启发。
一般情况下,你必须使用自定义封送,我相信。