4

私は構造を持っています

 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;
        }

次のエラーが発生します

System.ArgumentExceptionは未処理でしたMessage="Type'SERVER_USB_DEVICE'は、アンマネージ構造としてマーシャリングできません。意味のあるサイズやオフセットを計算できません。"

次の行で

Marshal.SizeOf(typeof(USBOverNetWrapper.FT_SERVER_USB_DEVICE));

コードの何が問題になっていますか?

アブドゥル・ハリク

4

2 に答える 2

10

MarshalAsAttribute.Valueが に設定されている場合、配列内の要素数を示すように を設定ByValArrayするSizeConst必要があります。文字列型を区別する必要がある場合、フィールドにはオプションで配列要素を含めるArraySubTypeことができます。UnmanagedType

ただし、代わりにこれを使用することをお勧めします。

ByValTStr: 構造内に表示されるインラインの固定長文字配列に使用されます。で使用される文字タイプは、包含構造体に適用される の引数 ByValTStrによって決定され ます。配列のサイズを示すには、常にこのフィールドを使用してください。System.Runtime.InteropServices.CharSetSystem.Runtime.InteropServices.StructLayoutAttributeMarshalAsAttribute.SizeConst

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
// OR [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.ByValTStr, SizeConst = 256)]
    string usbDeviceDescr;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    string locationInfo;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    string nickName;
}
于 2009-08-28T05:53:15.690 に答える
3
[StructLayout(LayoutKind.Sequential, Pack = 1)]
     public struct SERVER_USB_DEVICE{
         ....
     }

http://msdn.microsoft.com/en-us/library/5s4920fa.aspx

于 2009-08-28T05:46:28.857 に答える