我想使用编组将本机结构读入C#类型.我对Marshal结构的方法是这样的:
T Readobject<T>(BinaryReader br) { var bytes = br.ReadBytes(Marshal.SizeOf(typeof(T))); var handle = GCHandle.Alloc(bytes,GCHandleType.Pinned); try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedobject(),typeof(T)); } finally { handle.Free(); } }
现在这一般工作正常,问题出现在以下类型:
[StructLayout(LayoutKind.Sequential,Pack=1)] class SubData { public short A1; public short A2; } [StructLayout(LayoutKind.Sequential,Pack=1)] class Data { public short Id; [MarshalAs(UnmanagedType.ByValArray,SizeConst=3)] public SubData[] SubDatas; }
请注意,如果SubData是一个结构,这可以正常工作!但是如果SubData是一个类,它会导致Marshal.PtrToStructure抛出FatalExecutionEngineError.我想坚持使用类,因为有时候我的类型有默认值,结构不能有字段初始化器和默认构造函数,而且其中一些类型相当大.
谢谢您的帮助.
编辑:错误消息是“运行时遇到致命错误.错误的地址是0x6af99aec,在线程0x348.错误代码是0xc0000005.此错误可能是CLR中的错误或不安全或非错误用户代码的可验证部分.此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈.“
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。