C#에서 다음 구조체를 만들려고합니다. C 구조체를 기반으로하는 복잡한 구조체입니다. 대부분의 마샬링 옵션을 시도했지만 항상 'System'을 사용합니다. TypeLoadException '입니다.구조체가 잘못 정렬되었습니다. System.TypeLoadException
(추가 정보 : 'WindowsFormsApplication1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'으로 'WindowsFormsApplication1.COMPLEX_STRUCT'형식을로드 할 수 없습니다. 오프셋 8의 개체 필드가 잘못 정렬되었거나 . 나는 64 기계에있어
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string Addr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] Addr;
하지만 IPV6_ADDR : 개체가 아닌 필드에 의해 중복)
IPV6_ADDR 구조체에 관해서는, 나는 LayoutKind.Explicit 및 LayoutKind.Sequential, 모두 모두 시도 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