gpt4 book ai didi

c# - 如何在没有不安全的情况下正确编码 C# 中的非托管数组

转载 作者:行者123 更新时间:2023-11-30 15:21:38 25 4
gpt4 key购买 nike

我有非托管结构:

typedef struct 
{
char a[48];
BYTE b;
BYTE c;
BYTE d;
BYTE e;
BYTE f;
BYTE x;
char y[32];
char z[128][32];
}SOMELIKE_STRUCT

我试图编码它,因为它是在 StackOverflow 的另一个线程中编写的:

    [StructLayout(LayoutKind.Explicit, Pack = 1)]
public struct SOMELIKE_STRUCT
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 48)]
public byte[] a;
[FieldOffset(48)]
public byte b;
[FieldOffset(49)]
public byte c;
[FieldOffset(50)]
public byte d;
[FieldOffset(51)]
public byte e;
[FieldOffset(52)]
public byte f;
[FieldOffset(53)]
public byte x;
[FieldOffset(54)]
[MarshalAs(UnmanagedType.ByValArray, ArraySubType=UnmanagedType.U1, SizeConst = 32)]
public byte[] y;
[FieldOffset(86)]
[MarshalAs(UnmanagedType.ByValArray, ArraySubType=UnmanagedType.Struct, SizeConst = 128)]
public STRUCT[] z;
}

[StructLayout(LayoutKind.Explicit, Pack = 1)]
public struct STRUCT
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 32)]
public byte[] name;
}

我有异常(exception):

System.TypeLoadException 未处理 附加信息:无法从程序集中加载类型“SOMELIKE_STRUCT” 'ConsoleApplication2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 因为 它在偏移量“54”处包含一个未正确对齐或重叠的对象字段 通过非对象字段。

  1. 当我使用 new 创建此结构时出现异常:

    SOMELIKE_STRUCT l = new SOMELIKE_STRUCT();

  2. 异常显示我何时使用该结构(在创建该结构的实例之前)创建类(进入构造函数时)

最佳答案

由于您的定义似乎是正确的,因此无法完全弄清楚这里发生了什么。

将布局更改为顺序布局并删除手动字段偏移似乎可行:

[StructLayout( LayoutKind.Sequential, Pack = 1 )]
public struct SOMELIKE_STRUCT
{
[MarshalAs( UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 48 )]
public byte[] a;
public byte b;
public byte c;
public byte d;
public byte e;
public byte f;
public byte x;
[MarshalAs( UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 32 )]
public byte[] y;
[MarshalAs( UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 128 )]
public STRUCT[] z;
}

[StructLayout( LayoutKind.Sequential, Pack = 1 )]
public struct STRUCT
{
[MarshalAs( UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 32 )]
public byte[] name;
}

使用 Marshal.SizeOf 检查大小得到 4182 字节,使用 Marshal.OffsetOf 检查生成的布局给出与原始代码相同的偏移量。我相信这里的其他人可以详细说明为什么会发生这种情况。

关于c# - 如何在没有不安全的情况下正确编码 C# 中的非托管数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37068036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com