Я пытаюсь создать следующую структуру в 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;
@TyCobb имеет его. Поскольку строки управляются временем выполнения .NET, вы не можете накладывать структуру, содержащую строку с той, у которой также нет строки с тем же локальным смещением. –
OK Thx, я действительно не против переключения с строки на байт []/char [], но я тоже это пробовал, и все равно ничего хорошего – n00b
Я добавил исходные структуры на ваш вопрос. Пожалуйста, удалите свой ответ. – TyCobb