私はいくつかのC#interopの作業をしています。私は、次の構造体を持っている:C#:配列を含む構造体をマーシャリングする
#pragma pack(push,1)
typedef struct
{
unsigned __int64 Handle;
LinkType_t Type;
LinkState_t State;
unsigned __int64 Settings;
signed __int8 Name[MAX_LINK_NAME];
unsigned __int8 DeviceInfo[MAX_LINK_DEVINFO];
unsigned __int8 Reserved[40];
} LinkInfo_t;
これは、C#の構造体に変換する私の試みです:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct LinkInfo_t
{
[MarshalAs(UnmanagedType.U8)]
public UInt64 Handle;
MarshalAs(UnmanagedType.I4)]
public LinkType_t Type;
[MarshalAs(UnmanagedType.I4)]
public LinkState_t State;
[MarshalAs(UnmanagedType.U8)]
public UInt64 Settings;
[MarshalAs(UnmanagedType.LPStr, SizeConst = MAX_LINK_NAME)]
public string Name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_LINK_DEVINFO, ArraySubType = UnmanagedType.U1)]
public byte[] DeviceInfo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40, ArraySubType = UnmanagedType.U1)]
public byte[] Reserved;
}
しかし、私は名前、DEVICEINFO、および予約フィールドがすべて設定されている構造体を初期化する時はいつでもnullにするこれをどうやって解決するのですか?
これは配列に対して機能します。ただし、正しい構文は パブリック固定バイトDeviceInfo [MAX_LINK_DEVINFO]です。 また、構造体が安全でないと宣言する必要があります。 –
あなたは正しいですが、安全ではなく固定された –