2014-10-06 1 views
0

Я пытаюсь создать следующую структуру в C#, ее сложную структуру, основанную на C, я пробовал большинство параметров маршалинга, но я всегда получаю «Систему». TypeLoadException.Строка неправильно выровнена: System.TypeLoadException

(Дополнительная информация: Не удалось загрузить тип «WindowsFormsApplication1.COMPLEX_STRUCT» из сборки «WindowsFormsApplication1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null», поскольку он содержит поле объекта со смещением 8, которое неправильно выровнено или . перекрывается поле без объекта)

Что касается IPV6_ADDR структуры, я попытался как LayoutKind.Explicit и LayoutKind.Sequential, и как:

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
public string Addr; 

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] 
public byte[] Addr; 

Я на x64 машине, но IPV6_ADDR struct выровнена до 8 байтов, поэтому я не могу понять, в чем проблема.

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct IPV4_ADDR 
{ 
    public uint Addr; 
    public uint SubnetNumBits; 
}; 

[StructLayout(LayoutKind.Explicit, Pack = 1)] 
public struct IPV6_ADDR 
{ 
    [FieldOffset(0)] 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
    public string Addr; 
    [FieldOffset(16)] 
    public uint SubnetNumBits; 
}; 

[StructLayout(LayoutKind.Explicit, Pack = 1)] 
public struct COMPLEX_STRUCT 
{ 
    [FieldOffset(0)] 
    public byte A; 

    [FieldOffset(1)] 
    public byte B; 

    [FieldOffset(2)] 
    public byte C; 

    [FieldOffset(3)] 
    public byte D; 

    [FieldOffset(4)] 
    public byte E; 

    [FieldOffset(8)] 
    public IPV4_ADDR IPv4; 

    [FieldOffset(8)] 
    public IPV6_ADDR IPv6; 

    [FieldOffset(28)] 
    public ushort F; 
} 

Оригинальные Структуры C Я пытаюсь имитировать:

typedef struct _IPV4_ADDR 
{ 
    uint32_t Addr; 
    uint32_t SubnetNumBits; 
} IPV4_ADDR, *PIPV4_ADDR; 

typedef struct _IPV6_ADDR 
{ 
    uint8_t Addr[16]; 
    uint32_t SubnetNumBits; 
} IPV6_ADDR, *PIPV6_ADDR; 

typedef struct _COMPLEX_STRUCT 
{ 
    uint8_t A; 
    uint8_t B; 
    uint8_t C; 
    uint8_t D; 
    uint8_t E; 
    uint8_t Rsvd[3]; 
    union { 
     IPV4_ADDR IPv4; 
     IPV6_ADDR IPv6; 
    } u; 
    uint16_t F; 
} COMPLEX_STRUCT, *PCOMPLEX_STRUCT; 
+0

@TyCobb имеет его. Поскольку строки управляются временем выполнения .NET, вы не можете накладывать структуру, содержащую строку с той, у которой также нет строки с тем же локальным смещением. –

+0

OK Thx, я действительно не против переключения с строки на байт []/char [], но я тоже это пробовал, и все равно ничего хорошего – n00b

+0

Я добавил исходные структуры на ваш вопрос. Пожалуйста, удалите свой ответ. – TyCobb

ответ

1

После просмотра ваших оригинальных структур и глядя на других реализациях для IPv4 и IPv6 структур, я вижу, что другие реализации используют byte[4] для IPv4-адреса в ,

Я не могу гарантировать, что результаты будут верными, но если вы в состоянии изменить IPV4 и IPV6, вместо этого используйте byte[], ваша ошибка исчезнет.

Вы не можете смешивать и не совпадать, как вы нашли. Единственный другой вариант, о котором я могу попытаться, - посмотреть, разрешит ли он вам использовать , чтобы получить местоположение памяти, а затем используйте Marshal.Copy для захвата данных.

Несмотря на то, что как только вы их заработаете, я не могу гарантировать, что ваши результаты будут правильными.

+0

Я хочу объединить их, я конвертирую структуру C, которая имеет объединение полей IPV4 и IPV6. Я действительно не против переключения с строки на байт []/char [], но я тоже это пробовал, и все равно ничего хорошего – n00b

+0

@ n00b Вероятно, единственный способ, которым это будет работать, - это разбить байт [] между 2 'ulongs'. Имейте FieldOffset (0) и FieldOffset (8), а затем объедините 2 longs назад в один байт [], когда вам нужно работать с данными (метод в структуре). – TyCobb

+0

@ n00b Можете ли вы также показать фактические структуры, которые вы пытаетесь имитировать? Я начинаю думать, что структуры IPVx должны использовать 'IntPtr' вместо' unint' и 'string'. – TyCobb

 Смежные вопросы

  • Нет связанных вопросов^_^