2013-06-07 9 views
7

Ich arbeite an einer C# -WPF-Anwendung und versuchen, eine nicht verwaltete DLL (haben keinen Zugriff auf die Quelle). Die Struktur, die ich brauche, ist 'NET_DVR_IPPARACFG_V40', die eine Reihe anderer Strukturen/Vereinigungen enthält. Hier ist die Info die Dokumentation gibt uns:C Union in C# Fehler falsch ausgerichtet oder überlappt von einem Nicht-Objekt-Feld

struct{ 
    DWORD     dwSize; 
    DWORD     dwGroupNum; 
    DWORD     dwAChanNum; 
    DWORD     dwDChanNum; 
    DWORD     dwStartDChan; 
    BYTE     byAnalogChanEnable[MAX_CHANNUM_V30]; 
    NET_DVR_IPDEVINFO_V31 struIPDevInfo[MAX_IP_DEVICE_V40]; 
    NET_DVR_STREAM_MODE  struStreamMode[MAX_CHANNUM_V30]; 
    BYTE     byRes2[20]; 
}NET_DVR_IPPARACFG_V40 

struct{ 
    BYTE    byEnable; 
    BYTE    byProType; 
    BYTE    byEnableQuickAdd; 
    BYTE    byRes1; 
    BYTE    sUserName[NAME_LEN]; 
    BYTE    sPassword[PASSWD_LEN]; 
    BYTE    byDomain[MAX_DOMAIN_NAME]; 
    NET_DVR_IPADDR  struIP; 
    WORD    wDVRPort; 
    BYTE    byRes2[34]; 
}NET_DVR_IPDEVINFO_V31 

struct{ 
    char sIpV4[16]; 
    BYTE sIpV6[128]; 
}NET_DVR_IPADDR 

struct{ 
    BYTE      byGetStreamType; 
    BYTE      byRes[3]; 
    NET_DVR_GET_STREAM_UNION uGetStream; 
}NET_DVR_STREAM_MODE 

union{ 
    NET_DVR_IPCHANINFO   struChanInfo; 
    NET_DVR_IPSERVER_STREAM  struIPServerStream; 
    NET_DVR_PU_STREAM_CFG  struPUStream; 
    NET_DVR_DDNS_STREAM_CFG  struDDNSStream; 
    NET_DVR_PU_STREAM_URL  struStreamUrl; 
    NET_DVR_HKDDNS_STREAM  struHkDDNSStream; 
}NET_DVR_GET_STREAM_UNION 

struct{ 
    BYTE  byEnable; 
    BYTE  byIPID; 
    BYTE  byChannel; 
    BYTE  byIPIDHigh; 
    BYTE  byRes[32]; 
}NET_DVR_IPCHANINFO 

struct{ 
    BYTE    byEnable; 
    BYTE    byRes[3]; 
    NET_DVR_IPADDR  struIPServer; 
    WORD    wPort; 
    WORD    wDvrNameLen; 
    BYTE    byDVRName[NAME_LEN]; 
    WORD    wDVRSerialLen; 
    WORD    byRes1[2]; 
    BYTE    byDVRSerialNumber[SERIALNO_LEN]; 
    BYTE    byUserName[NAME_LEN]; 
    BYTE    byPassWord[PASSWD_LEN]; 
    BYTE    byChannel; 
    BYTE    byRes2[11]; 
}NET_DVR_IPSERVER_STREAM 

struct{ 
    DWORD        dwSize; 
    NET_DVR_STREAM_MEDIA_SERVER_CFG struStreamMediaSvrCfg; 
    NET_DVR_DEV_CHAN_INFO    struDevChanInfo; 
}NET_DVR_PU_STREAM_CFG 

struct{ 
    NET_DVR_IPADDR struIP; 
    WORD    wDVRPort; 
    BYTE    byChannel; 
    BYTE    byTransProtocol; 
    BYTE    byTransMode; 
    BYTE    byFactoryType; 
    BYTE    byDeviceType; 
    BYTE    byDispChan; 
    BYTE    bySubDispChan; 
    BYTE    byRes[3]; 
    BYTE    byDomain[MAX_DOMAIN_NAME]; 
    BYTE    sUserName[NAME_LEN]; 
    BYTE    sPassword[PASSWD_LEN]; 
}NET_DVR_DEV_CHAN_INFO 

struct{ 
    DWORD        dwSize; 
    NET_DVR_STREAM_MEDIA_SERVER_CFG struStreamMediaSvrCfg; 
    NET_DVR_DEV_CHAN_INFO    struDevChanInfo; 
}NET_DVR_PU_STREAM_CFG 

struct{ 
    BYTE    byValid; 
    BYTE    byRes1[3]; 
    NET_DVR_IPADDR struDevIP; 
    WORD    wDevPort; 
    BYTE    byTransmitType; 
    BYTE    byRes2[69]; 
}NET_DVR_STREAM_MEDIA_SERVER_CFG 

struct{ 
    BYTE    byEnable; 
    BYTE    byRes1[3]; 
    NET_DVR_IPADDR  struStreamServer; 
    WORD    wStreamServerPort; 
    BYTE    byStreamServerTransmitType; 
    BYTE    byRes2; 
    NET_DVR_IPADDR  struIPServer; 
    WORD    wIPServerPort; 
    BYTE    byRes3[2]; 
    BYTE    sDVRName[NAME_LEN]; 
    WORD    wDVRNameLen; 
    WORD    wDVRSerialLen; 
    BYTE    sDVRSerialNumber[SERIALNO_LEN]; 
    BYTE    sUserName[NAME_LEN]; 
    BYTE    sPassWord[PASSWD_LEN]; 
    WORD    wDVRPort; 
    BYTE    byRes4[2]; 
    BYTE    byChannel; 
    BYTE    byTransProtocol; 
    BYTE    byTransMode; 
    BYTE    byFactoryType; 
}NET_DVR_DDNS_STREAM_CFG 

struct{ 
    BYTE byEnable; 
    BYTE strURL[240]; 
    BYTE byTransPortocol ; 
    WORD wIPID; 
    BYTE byChannel; 
    BYTE byRes[7]; 
}NET_DVR_PU_STREAM_URL 

struct{ 
    BYTE byEnable; 
    BYTE byRes[3]; 
    BYTE byDDNSDomain[64]; 
    WORD wPort; 
    WORD wAliasLen; 
    BYTE byAlias[NAME_LEN]; 
    WORD wDVRSerialLen; 
    BYTE byRes1[2]; 
    BYTE byDVRSerialNumber[SERIALNO_LEN]; 
    BYTE byUserName[NAME_LEN]; 
    BYTE byPassWord[PASSWD_LEN]; 
    BYTE byChannel; 
    BYTE byRes2[11]; 
}NET_DVR_HKDDNS_STREAM 

I Tonnen Dokumentation gelesen haben online und kann immer noch nicht scheinen, um diese ‚NET_DVR_IPPARACFG_V40‘ richtig gemarshallt zu erhalten. Hier ist, was ich in C#:

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_IPPARACFG_V40 
{ 
    public uint dwSize; 
    public uint dwGroupNum; 
    public uint dwAChanNum; 
    public uint dwDChanNum; 
    public uint dwStartDChan; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.I1)] 
    public byte[] byAnalogChanEnable; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_IP_DEVICE_V40, ArraySubType = UnmanagedType.Struct)] 
    public NET_DVR_IPDEVINFO_V31[] struIPDevInfo; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.Struct)] 
    public NET_DVR_STREAM_MODE[] struStreamMode; 
    public byte[] byRes2; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_IPPARACFG_V40 
{ 
    public uint dwSize; 
    public uint dwGroupNum; 
    public uint dwAChanNum; 
    public uint dwDChanNum; 
    public uint dwStartDChan; 
    unsafe public fixed byte byAnalogChanEnable[MAX_CHANNUM_V30]; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_IP_DEVICE_V40, ArraySubType = UnmanagedType.Struct)] 
    public NET_DVR_IPDEVINFO_V31[] struIPDevInfo; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.Struct)] 
    public NET_DVR_STREAM_MODE[] struStreamMode; 
    unsafe public fixed byte byRes2[20]; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_IPDEVINFO_V31 
{ 
    public byte byEnable; 
    public byte byProType; 
    public byte byEnableQuickAdd; 
    public byte byRes1; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] sUserName; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = PASSWD_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] sPassword; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DOMAIN_NAME, ArraySubType = UnmanagedType.I1)] 
    public byte[] byDomain; 
    public NET_DVR_IPADDR struIP; 
    public ushort wDVRPort; 
    public byte[] byRes; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_IPDEVINFO_V31 
{ 
    public byte byEnable; 
    public byte byProType; 
    public byte byEnableQuickAdd; 
    public byte byRes1; 
    unsafe public fixed byte sUserName[NAME_LEN]; 
    unsafe public fixed byte sPassword[PASSWD_LEN]; 
    unsafe public fixed byte byDomain[MAX_DOMAIN_NAME]; 
    public NET_DVR_IPADDR struIP; 
    public ushort wDVRPort; 
    unsafe public fixed byte byRes[34]; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_STREAM_MODE 
{ 
    public byte byGetStreamType; 
    public byte[] byRes; 
    public NET_DVR_GET_STREAM_UNION uGetStream; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_STREAM_MODE 
{ 
    public byte byGetStreamType; 
    unsafe public fixed byte byRes[3]; 
    public NET_DVR_GET_STREAM_UNION uGetStream; 
} 

/*[StructLayout(LayoutKind.Explicit, Size = 528)] 
public struct NET_DVR_GET_STREAM_UNION 
{ 
    [FieldOffset(0)] 
    public NET_DVR_IPCHANINFO struChanInfo; 
    [FieldOffset(0)] 
    public NET_DVR_IPSERVER_STREAM struIPServerStream; 
    [FieldOffset(0)] 
    public NET_DVR_PU_STREAM_CFG struPUStream; 
    [FieldOffset(0)] 
    public NET_DVR_DDNS_STREAM_CFG struDDNSStream; 
    [FieldOffset(0)] 
    public NET_DVR_PU_STREAM_URL struStreamUrl; 
    [FieldOffset(0)] 
    public NET_DVR_HKDDNS_STREAM struHkDDNSStream; 
}*/ 
[StructLayout(LayoutKind.Explicit)] 
public struct NET_DVR_GET_STREAM_UNION 
{ 
    [FieldOffset(0)] 
    public NET_DVR_IPCHANINFO struChanInfo; 
    [FieldOffset(0)] 
    public NET_DVR_IPSERVER_STREAM struIPServerStream; 
    [FieldOffset(0)] 
    public NET_DVR_PU_STREAM_CFG struPUStream; 
    [FieldOffset(0)] 
    public NET_DVR_DDNS_STREAM_CFG struDDNSStream; 
    [FieldOffset(0)] 
    public NET_DVR_PU_STREAM_URL struStreamUrl; 
    [FieldOffset(0)] 
    public NET_DVR_HKDDNS_STREAM struHkDDNSStream; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct NET_DVR_IPADDR 
{ 

    /// char[16] 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)] 
    public string sIpV4; 

    /// BYTE[128] 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 128, ArraySubType = UnmanagedType.I1)] 
    public byte[] byRes; 

    public void Init() 
    { 
     byRes = new byte[128]; 
    } 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_IPADDR 
{ 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)] 
    public string sIpV4; 
    unsafe public fixed byte byRes[128]; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_DEV_CHAN_INFO 
{ 
    public NET_DVR_IPADDR struIP; 
    public ushort wDVRPort; 
    public byte byChannel; 
    public byte byTransProtocol; 
    public byte byTransMode; 
    public byte byFactoryType; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I1)] 
    public byte[] byRes; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = MAX_DOMAIN_NAME)] 
    public string byDomain; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = NAME_LEN)] 
    public string sUserName; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = PASSWD_LEN)] 
    public string sPassword; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_DEV_CHAN_INFO 
{ 
    public NET_DVR_IPADDR struIP; 
    public ushort wDVRPort; 
    public byte byChannel; 
    public byte byTransProtocol; 
    public byte byTransMode; 
    public byte byFactoryType; 
    unsafe public fixed byte byRes[6]; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = MAX_DOMAIN_NAME)] 
    public string byDomain; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = NAME_LEN)] 
    public string sUserName; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = PASSWD_LEN)] 
    public string sPassword; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_STREAM_MEDIA_SERVER_CFG 
{ 
    public byte byValid; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)] 
    public byte[] byRes1; 
    public NET_DVR_IPADDR struDevIP; 
    public ushort wDevPort; 
    public byte byTransmitType; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 69, ArraySubType = UnmanagedType.I1)] 
    public byte[] byRes2; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_STREAM_MEDIA_SERVER_CFG 
{ 
    public byte byValid; 
    unsafe public fixed byte byRes1[3]; 
    public NET_DVR_IPADDR struDevIP; 
    public ushort wDevPort; 
    public byte byTransmitType; 
    unsafe public fixed byte byRes2[69]; 
} 



/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_IPCHANINFO 
{ 
    public byte byEnable; 
    public byte byIPID; 
    public byte byChannel; 
    public byte byProType; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] 
    public byte[] byRes; 
    public void Init() 
    { 
     byRes = new byte[32]; 
    } 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_IPCHANINFO 
{ 
    public byte byEnable; 
    public byte byIPID; 
    public byte byChannel; 
    public byte byProType; 
    unsafe public fixed byte byRes[32]; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_IPSERVER_STREAM 
{ 
    public byte byEnable; 
    public byte[] byRes; 
    public NET_DVR_IPADDR struIPServer; 
    public ushort wPort; 
    public ushort wDvrNameLen; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] byDVRName; 
    public ushort wDVRSerialLen; 
    public ushort[] byRes1; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] byDVRSerialNumber; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] byUserName; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = PASSWD_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] byPassWord; 
    public byte byChannel; 
    public byte[] byRes2; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_IPSERVER_STREAM 
{ 
    public byte byEnable; 
    unsafe public fixed byte byRes[3]; 
    public NET_DVR_IPADDR struIPServer; 
    public ushort wPort; 
    public ushort wDvrNameLen; 
    unsafe public fixed byte byDVRName[NAME_LEN]; 
    public ushort wDVRSerialLen; 
    unsafe public fixed ushort byRes1[2]; 
    unsafe public fixed byte byDVRSerialNumber[SERIALNO_LEN]; 
    unsafe public fixed byte byUserName[NAME_LEN]; 
    unsafe public fixed byte byPassWord[PASSWD_LEN]; 
    public byte byChannel; 
    unsafe public fixed byte byRes2[11]; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_PU_STREAM_CFG 
{ 
    public uint dwSize; 
    public NET_DVR_STREAM_MEDIA_SERVER_CFG struStreamMediaSvrCfg; 
    public NET_DVR_DEV_CHAN_INFO struDevChanInfo; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public unsafe struct NET_DVR_PU_STREAM_CFG 
{ 
    public uint dwSize; 
    public NET_DVR_STREAM_MEDIA_SERVER_CFG struStreamMediaSvrCfg; 
    public NET_DVR_DEV_CHAN_INFO struDevChanInfo; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_DDNS_STREAM_CFG 
{ 
    public byte byEnable; 
    public byte[] byRes1; 
    public NET_DVR_IPADDR struStreamServer; 
    public ushort wStreamServerPort; 
    public byte byStreamServerTransmitType; 
    public byte byRes2; 
    public NET_DVR_IPADDR struIPServer; 
    public byte wIPServerPort; 
    public byte[] byRes3; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] sDVRName; 
    public ushort wDVRNameLen; 
    public ushort wDVRSerialLen; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] sDVRSerialNumber; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] sUserName; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = PASSWD_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] sPassWord; 
    public ushort wDVRPort; 
    public byte[] byRes4; 
    public byte byChannel; 
    public byte byTransProtocol; 
    public byte byTransMode; 
    public byte byFactoryType; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_DDNS_STREAM_CFG 
{ 
    public byte byEnable; 
    unsafe public fixed byte byRes1[3]; 
    public NET_DVR_IPADDR struStreamServer; 
    public ushort wStreamServerPort; 
    public byte byStreamServerTransmitType; 
    public byte byRes2; 
    public NET_DVR_IPADDR struIPServer; 
    public byte wIPServerPort; 
    unsafe public fixed byte byRes3[2]; 
    unsafe public fixed byte sDVRName[NAME_LEN]; 
    public ushort wDVRNameLen; 
    public ushort wDVRSerialLen; 
    unsafe public fixed byte sDVRSerialNumber[SERIALNO_LEN]; 
    unsafe public fixed byte sUserName[NAME_LEN]; 
    unsafe public fixed byte sPassWord[PASSWD_LEN]; 
    public ushort wDVRPort; 
    unsafe public fixed byte byRes4[2]; 
    public byte byChannel; 
    public byte byTransProtocol; 
    public byte byTransMode; 
    public byte byFactoryType; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_PU_STREAM_URL 
{ 
    public byte byEnable; 
    public byte[] strURL; 
    public byte byTransPortocol; 
    public ushort wIPID; 
    public byte byChannel; 
    public byte[] byRes; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_PU_STREAM_URL 
{ 
    public byte byEnable; 
    unsafe public fixed byte strURL[240]; 
    public byte byTransPortocol; 
    public ushort wIPID; 
    public byte byChannel; 
    unsafe public fixed byte byRes[7]; 
} 

/*[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_HKDDNS_STREAM 
{ 
    public byte byEnable; 
    public byte[] byRes; 
    public byte[] byDDNSDomain; 
    public ushort wPort; 
    public ushort wAliasLen; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] byAlias; 
    public ushort wDVRSerialLen; 
    public byte[] byRes1; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] byDVRSerialNumber; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] byUserName; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = PASSWD_LEN, ArraySubType = UnmanagedType.I1)] 
    public byte[] byPassWord; 
    public byte byChannel; 
    public byte[] byRes2; 
}*/ 
[StructLayoutAttribute(LayoutKind.Sequential, Pack = 1)] 
public struct NET_DVR_HKDDNS_STREAM 
{ 
    public byte byEnable; 
    unsafe public fixed byte byRes[3]; 
    unsafe public fixed byte byDDNSDomain[64]; 
    public ushort wPort; 
    public ushort wAliasLen; 
    unsafe public fixed byte byAlias[NAME_LEN]; 
    public ushort wDVRSerialLen; 
    unsafe public fixed byte byRes1[2]; 
    unsafe public fixed byte byDVRSerialNumber[SERIALNO_LEN]; 
    unsafe public fixed byte byUserName[NAME_LEN]; 
    unsafe public fixed byte byPassWord[PASSWD_LEN]; 
    public byte byChannel; 
    unsafe public fixed byte byRes2[11]; 
} 

Es kompiliert, aber wenn ich den Anruf zu tätigen, die diese Struktur verwendet ich den Fehler „Typ konnte nicht geladen werden, da es sich um ein Objektfeld enthält bei Offset 0, die falsch ausgerichtet ist, oder überlappt von einem Nicht-Objekt-Feld. " Die Strukturen in der Union sind alle unterschiedlich groß, ich bin mir nicht sicher, ob das ein Problem ist, aber es ist erwähnenswert. Der Hersteller gab mir tatsächlich die obigen C# -Strukturen, aber ich glaube nicht, dass sie es wirklich getestet haben, da es nicht funktioniert. Dies ist das erste Mal, dass ich mit Gewerkschaften zu tun habe, also bin ich mir nicht sicher, wie ich damit umgehen soll. Das Ausmaß meines Wissens ist von der Forschung in den letzten paar Wochen.

Wenn jemand einen Einblick geben könnte, würde ich es sehr schätzen.

+1

Da STRUCT_B enthält einzelnes Byte (BJA) und 3-Byte-Array (BYB) scheint es, dass es von Bytes ausgerichtet werden soll: [StructLayoutAttribute (LayoutKind.Sequential, Packung = 1)] public struct STRUCT_B –

+1

Könnten Sie STRUCT_A bieten. .STRUCT_H um den Fehler zu reproduzieren? –

+0

Okay, dies ist ein öffentliches SDK, also habe ich, anstatt mir die Zeit zu nehmen, alles umzubenennen, einfach das geändert, was ich vorher hatte. Die Hauptstruktur, die ich erstellen möchte, ist 'NET_DVR_IPPARACFG_V40'. Alle anderen aufgelisteten Strukturen stehen in irgendeiner Weise mit dieser einen Struktur in Beziehung. Ich werde in einer Minute aktualisieren, was ich in C# habe. – Brian

Antwort

0

Mit Hilfe von anderen haben wir endlich die Strukturen erarbeitet. Hier ist der 2 structs mit der Gewerkschaft zu tun:

[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_GET_STREAM_UNION 
{ 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 492, ArraySubType = UnmanagedType.I1)] 
    public byte[] byUnion; 
    public void Init() 
    { 
     byUnion = new byte[492]; 
    } 
} 

[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct NET_DVR_STREAM_MODE 
{ 
    public byte byGetStreamType; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)] 
    public byte[] byRes; 
    public NET_DVR_GET_STREAM_UNION uGetStream; 
    public void Init() 
    { 
     byGetStreamType = 0; 
     byRes = new byte[3]; 
     uGetStream.Init(); 
    } 
} 

Grundsätzlich verwenden wir nur ein byte [] für die Vereinigung für die anonymen Daten. Dann, wenn wir den Aufruf ausführen, können wir byGetStreamType in NET_DVR_STREAM_MODE als einen Schalter verwenden, um das Byte [] auf den entsprechenden Typ zu parsen/umwandeln.

Danke für den Beitrag von allen, die geholfen haben.

0

Ich bin mir nicht sicher, aber die Größe kann aus sein. Wenn der 528 auf 32-Bit-Zeigern basiert und Sie mit 64-Bit-Zeigern kompilieren, wäre die Größe zu klein. Einer der STRUCT_X struX könnte dann die Struktur "überlaufen".

An welchem ​​Punkt wirft es die Ausnahme? Richtig, wenn das Programm startet oder wenn Sie zuerst versuchen, eines der union_a s/main_struct s zu machen?

+0

Ich baue das tatsächlich gegen x86. Ich versuche noch nicht mal x64. Ich bekomme den Fehler, wenn ich versuche, die Struktur zu erstellen. Es wird kompiliert und ausgeführt, bis ich auf die Schaltfläche klicke, die die zu erstellende Struktur initiieren würde. – Brian

+0

Wird Größe benötigt? Was passiert, wenn Sie die Größe entfernen und den Compiler wählen lassen? – Cemafor

+0

Ich entfernte es und bekam das gleiche Ergebnis. Ich bin nicht sicher, ob es erforderlich ist oder nicht ... – Brian

1

Während marhalling wir die Aufmerksamkeit auf zwei Dinge bezahlen sollte:

  1. Alignments (1, 2, 4 Byte)
  2. Größen und Offsets

    Jedes Mal, wenn wir in Werte wie BYTE laufen, WORD, BYTE [69], die nicht 4-Byte (32 Bit) ausgerichtet wir sollten explizit Ausrichtung gelegt:

[StructLayout(LayoutKind.Sequential, Pack = 1)] // <- Pack = 1, byte border alignment 

Immer, wenn wir Arrays wie BYTE haben [69] sollten wir .Net über Arrays' Größen informieren, wie folgt aus:

fixed byte byRes2[69]; // <- do not move (re-align) 69 bytes! And address them as array 

Schließlich können wir prüfen, ob wir habe mit der Funktion sizeof() alles richtig gemacht. Lassen Sie uns zum Beispiel Marschall eine der gegebenen Strukturen

struct{ 
    BYTE    byValid; 
    BYTE    byRes1[3]; 
    NET_DVR_IPADDR struDevIP; 
    WORD    wDevPort; 
    BYTE    byTransmitType; 
    BYTE    byRes2[69]; 
    }NET_DVR_STREAM_MEDIA_SERVER_CFG 

Wir können sehen, dass es nicht-triviale Ausrichtung hat (da structire einzelne Bytes, Wörter enthält, Arrays, die nicht 4 * Byte-Werte) sowie Arrays.So wird die C# Wrap sein

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public unsafe struct NET_DVR_STREAM_MEDIA_SERVER_CFG { 
    byte  byValid; 
    fixed byte byRes1[3]; 
    int  struDevIP; // <- I suggest IP v4 using here (Int32) 
    UInt16  wDevPort; 
    byte  byTransmitType; 
    fixed byte byRes2[69]; 
    } 

Es ist Zeit, zu überprüfen: die anfängliche Strukturgröße verwendet 1 + 3 + 4 + 2 + 1 + 69 = 80 Byte, Istmaß

sizeof(NET_DVR_STREAM_MEDIA_SERVER_CFG) 

dass liefert 80.

+0

Danke für die Info Dmitry. Das macht seit. Ich werde dieses Wochenende noch ein bisschen herumspielen und sehen, was mir einfällt. – Brian

+0

Dmitry, Ich aktualisiere den Code im zweiten Codeblock mit meinem "Versuch", aber ich bekomme immer noch die gleiche Fehlermeldung, wenn ich die Größe von 'NET_DVR_GET_STREAM_UNION' überprüfe. Sollte ich etwas anderes an den Strings und Arrays von Strukturen tun? – Brian