gpt4 book ai didi

c# - 在 C# 中使用数组成员编码(marshal)结构

转载 作者:太空狗 更新时间:2023-10-30 00:36:28 26 4
gpt4 key购买 nike

我正在使用 C# 和 P/Invoke 来访问 DLL 方法。该方法的定义如下:

[DllImport("userManager.dll")]
static extern int GetUsers(out IntPtr userList);

原始结构:

typedef struct user_list {
unsigned short NumUsers;
USER_LIST_ITEM List[VARLEN];
} USER_LIST

typedef struct user_list_item {
char name[260];
unsigned char address[256];
} USER_LIST_ITEM

我完成的结构布局如下:

[StructLayout(LayoutKind.Sequential)]
public class USER_LIST
{
public uint NumUsers;
[MarshalAs(UnmanagedType.ByValArray)]
public USER_LIST_ITEM [] List;
}

[StructLayout(LayoutKind.Sequential)]
public class USER_LIST_ITEM
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string address;
};

但是当我尝试解码它时出现错误:

USER_LIST userList = new USER_LIST();
// Prepare pointer
IntPtr uList = Marshal.AllocHGlobal(Marshal.SizeOf(userList));
Marshal.StructureToPtr(userList, uList, false);
result = GetUsers(out uList);

Marshal.PtrToStructure(uList, userList); <--

The runtime has encountered a fatal error. The address of the error was at 0x79f82af6, on thread 0x464. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

我正确地获得了 NumUsers 属性,但似乎在解码数组时发生了错误。有什么想法吗?

最佳答案

如果您在用作out 参数的结构中指定一个数组,您需要告诉编码(marshal)拆收器该数组的长度。对于您的代码,编码(marshal)拆收器可能正在分配一个零长度数组或仅使用 null,这会导致崩溃。不幸的是,似乎无法将可变长度的 out 数组指定为结构的成员,因为 MarshalAs.SizeParamIndex 仅适用于方法。您可能会使用 MarshalAs.SizeConst 指定一个大的、恒定大小的数组,但通常您必须像这样解析(大概是被调用方分配的)返回缓冲区:

var count = Marshal.ReadInt32 (uList) ;
var users = new List<USER_LIST_ITEM> () ;
var ptr = (long)uList + 4 ;
for (int i = 0 ; i < count ; ++i)
{
users.Add (Marshal.PtrToStructure (typeof (USER_LIST_ITEM),
new IntPtr (ptr))) ;
ptr += Marshal.SizeOf (typeof (USER_LIST_ITEM)) ;
}

您必须特别注意对齐和填充以及 32/64 位问题。

关于c# - 在 C# 中使用数组成员编码(marshal)结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1861475/

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