在具有布局的C#结构中未正确引用字符串

在具有布局的C#结构中未正确引用字符串,c#,structure,C#,Structure,我有一个结构 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SERVER_USB_DEVICE { USB_HWID usbHWID; byte status; bool bExcludeDevice; bool bSharedManually; ulong ulDeviceId; ulong ulClientAddr; [Marsha

我有一个结构

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SERVER_USB_DEVICE
{
    USB_HWID usbHWID;
    byte status;
    bool bExcludeDevice;
    bool bSharedManually;
    ulong ulDeviceId;
    ulong ulClientAddr;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    string usbDeviceDescr;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    string locationInfo;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    string nickName;
}
当我在win32 DLL函数中传递它时,如下所示:

[DllImport ("abc.dll", EntryPoint="EnumDevices", CharSet=CharSet.Ansi)]
public static extern bool EnumDevices(IntPtr lpUsbDevices,
                                      ref  ulong pulBufferSize, 
                                      IntPtr lpES);
我在结构的字符串成员中得到一些缺少的文本

假设SERVER_USB_DEVICE.usbdevicedscr包含值“Mass Storage DEVICE”,这是错误的,它应该包含值“USB Mass Storage DEVICE”


代码中有什么错误?

尝试使用
ByValTStr
而不是
ByValArray
您是否验证了结构中位于
usbdevicedsr
之前的字段(
状态
排除设备
手动共享
ulDeviceId
,以及
ulclientddr
)获得正确的值?是否是由于
USB\u HWID
结构的编组错误,导致结构其余部分的偏移量减少了4个字节?

您可以查看字节数组中的结构,以确保所有内容都正确对齐。试试这个:

int size = Marshal.SizeOf(typeof(SERVER_USB_DEVICE));
byte[] buffer1 = new byte[size];
SERVER_USB_DEVICE[] buffer2 = new SERVER_USB_DEVICE[1];
// put instance of SERVER_USB_DEVICE into buffer2
Buffer.BlockCopy(buffer2, 0, buffer1, 0, size);

实际上,我犯了个小错误,这里ULUN是C中的8字节,因为它是C++中的4字节(我们都知道)。将ulong转换为uint解决了问题。

USB\uHwid是什么样子的?我不认为这里有什么问题,字符串不能从开始就被截断,如果你认为你遗漏了一些文本,它一定是从结尾开始的,请正确地检查设备/帮助。我彻底检查了文档事实上坦率地说,我在vc++中编写了相同的代码。它工作正常,但在c#中没有。我改为ByValTStr,但没有效果OK。。。你能为EnumDevices功能发布C签名吗?BOOL EnumDevices(PFT_服务器_USB_设备lpUsbDevices、PULONG pulBufferSize、PFT_错误_状态lpES);您可以尝试在C#声明中指定服务器USB#设备数组,而不是IntPtr