我正在尝试将此C结构编组为C#:
#define NameSize 255
struct NamesList
{
unsigned long Size; // Number of <NameSize>-chunks in Names
char* Names; // will contain Size * <NameSize> characters!
};
这是我在C#中的结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct NamesList
{
public uint Size; // Number of <NameSize>-chunks in Names
[MarshalAs(UnmanagedType.LPStr)]
public string Names; // will contain Size * <NameSize> characters!
};
我将NamesList结构作为对以下C函数的引用传递:
int getNamelists(unsigned long Handle, NamesList* nameLists);
这是我在C#中的PInvoke签名:
[DllImport("remote.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int getNamelists(
uint handle, ref NamesList jNames);
当只存在一个名称时,该功能正常工作。但是,如果有2个以上的名称,则“名称”字段永远不会包含超过第一个名称的任何名称。名称字段始终等于第一个名称,即使存在3个名称(在这种情况下,大小正确分配给3)
我一直在尝试一些不同的东西,但我无法完成任何工作。什么可能导致像这样的问题?我尝试根据大小的大小将名称字段的SizeConst设置为255的倍数,但这也不起作用。任何帮助表示赞赏!
编辑:尝试编组成char []而不是字符串,但是这段代码存在一些问题
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct NamesList
{
public uint Size; // Number of <NameSize>-chunks in Names
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
public char[] Names; // will contain Size * <NameSize> characters!
};
编辑2:
我使用这个结构解决了我的问题:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct NamesList
{
public uint Size; // Number of <NameSize>-chunks in Names
[MarshalAs(UnmanagedType.LPStr)]
public IntPtr Names; // will contain Size * <NameSize> characters!
};
然后我使用Marshal.Copy将IntPtr转换为255 * Size的byte [],然后使用Encoding.GetString调用将该byte []转换为包含所有3个名称的字符串。