- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个结构:
[StructLayout(LayoutKind.Sequential)]
public struct IS
{
public UInt32 ID;
public UInt32 Quality;
public UInt32 Flags;
public UInt32 Flags2;
public UInt32 ContainerSlots;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public Int32[] ItemStatType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public UInt32[] ItemStatValue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public Int32[] ItemStatUnk1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public Int32[] ItemStatUnk2;
public UInt32 ScalingStatDistribution;
public UInt32 DamageType;
public UInt32 Delay;
public float RangedModRange;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public Int32[] SpellId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public Int32[] SpellTrigger;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public Int32[] SpellCharges;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public Int32[] SpellCooldown;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public Int32[] SpellCategory;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public Int32[] SpellCategoryCooldown;
public UInt32 Bonding;
public string Name;
public string Name2;
public string Name3;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public UInt32[] Color;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public UInt32[] Content;
};
我正在尝试使用 Marshal 和 GCHandle 从文件中读取字节并将这些字节复制到上面的 struct
中,我的代码如下:
reader = BinaryReader.FromFile(fileName);
m_rows = new List<IS>();
int size = Marshal.SizeOf(typeof(IS));
if(reader.BaseStream.Length < size)
return;
byte[] buffer = new byte[size];
buffer = reader.ReadBytes(size);
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
m_rows.Add((IS)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(IS)));
handle.Free();
但是我得到了一个AccessViolationException : attempt to read or write protected memory
我不知道为什么会抛出这个异常。
最佳答案
我没有立即看到错误并编写了一个小测试程序来重现该问题。使用二进制搜索找到问题,重复注释掉一半的字段,直到我将范围缩小到:
[StructLayout(LayoutKind.Sequential)]
public struct IS {
public string Name;
}
那行不通,pinvoke 编码器假定 string 的默认编码来自 C 字符串 char*
。这不可能更正您从文件中读取的数据,它永远不会包含有效的指针。 AccessViolation 在尝试取消引用指针时被触发。
问题中没有任何提示可以猜测字符串实际上是如何序列化到文件中的。 正常方式是:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct IS {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 42)]
public string Name;
};
如有必要,请使用十六进制查看器来确定 SizeConst 的正确值。如果编码不正常(不是系统默认页面),则必须将其声明为 byte[] 并使用适当的编码对其进行转换。
关于c# - Marshal.PtrToStructure 抛出 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26276077/
我的计算机中有一 block 硬件...共享内存。我用返回指向此共享内存的指针的 .dll 调用它。一旦返回指针,旧的 C++ 程序就会写入和读取映射到该指针的结构。 现在我想制作一个新的 C# 程序
有人可以向我解释以下参数异常:结构不能是值类吗?这是由我程序中的以下代码行引起的: Marshal.PtrToStructure(m.LParam, dbh); 假设 dbh 是以下类型: [Stru
谁能看出它失败的原因?如果我用“ref BITMAP lpvObject”替换“out IntPtr lpvObject”,我可以让它以这种方式工作。但我看不出代码有什么问题。 using Syste
在 C++ 中,我有这个: struct BasePacketProto { unsigned short PACKET_OPCODE; unsigned short PACKET_M
我有这个结构: [StructLayout(LayoutKind.Sequential)] public struct IS { public UInt32 ID;
在我的程序 (C#) 中,我使用方法 Marshal.PtrToStructure 将对象转换为在循环中将内存地址添加到结构。在第一个元素,这个工作正常。但是在第二个元素处,发生了访问冲突异常。 ac
我有一个系统,其中远程代理发送序列化结构(来自嵌入式 C 系统)供我通过 IP/UDP 读取和存储。在某些情况下,我需要发回相同的结构类型。我认为我使用 Marshal.PtrToStructure(
在 64 位中运行时,我的单元测试在这段代码上崩溃。 崩溃发生在循环第二次迭代的 Marshal.PtrToStructure 调用上。 “entriesRead”显示为 4,因此它应该能够正确读取,
我正试图对我公司的一堆遗留二进制数据进行逆向工程,以便我可以将其转换为更持久的格式。我们用于创建此数据的应用程序不再受支持。 我发现我可以在一系列结构中描述数据,并且我已经能够使用 Marshal.P
JNA 中 .NET 的 Marshal.PtrToStructure 有什么等价物? 我正在尝试用 Java 编写一个 Firefox 密码解密器,并且正在查看 C# 的等效项,我已经完成了其中的大
我正在尝试将 byte[] 转换为包含数组的结构,该结构包含数组。 像这样: [StructLayout(LayoutKind.Sequential, Pack = 4)] public struct
我通过调用 Marshal.PtrToStructure(intPtr, typeof(Servent)) 得到一个 AccessViolationExcpetion。任何想法我做错了什么?我在 x6
我正在使用 unity3d 开发一个游戏项目。 现在我正在尝试统一将结构从 C++ 传递到 C#。 C++ 中的结构如下所示: #pragma pack(push) #pragma pack(1) c
我正在尝试从键盘 Hook 的 lParam 获取 KBDLLHOOKSTRUCT。 private static IntPtr HookCallback(int nCode, IntPtr
我有这个 C++ 代码: extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo) { *foo =
我在使用 Marshal.PtrToStructure() 从指向 DEVMODE 类型结构的指针中提取数据时遇到问题。 Here是指向 DEVMODE 结构上的 MSDN 条目的链接。 我对该结构的
我有一个使用 PInvoke 在 C# 和 C++ 之间编码数据的应用程序。该应用程序是一个本地 C++ 应用程序,它在内部使用 C# 部分启动 CLR。 有时我必须将数据从 C++ 编码到 C#
我正在尝试使用现有代码将包含 std::bitsets 的 C++ 结构映射到它的 C# 版本。 我的代码在这些简单的对象上工作得很好: // C++ struct struct log_t {
我们在尝试 PInvoke read() 时遇到奇怪的行为linux/libc 与 Mono 的方法。 [16:05:17.258][UNHANDLED EXCEPTION][BEGIN][16:05
我是一名优秀的程序员,十分优秀!