从C到C#的编组结构 - 字符串字段被截断?

时间:2017-10-13 20:01:24

标签: c# struct marshalling

我正在尝试将此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个名称的字符串。

0 个答案:

没有答案