Bạn sẽ cần một máy 64bit nếu bạn muốn xem ngoại lệ actuall. Tôi đã tạo ra một số lớp giả mà repro của vấn đề.TypeLoadException trên x64 nhưng tốt trên x86 với structlayouts
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class InnerType
{
char make;
char model;
UInt16 series;
}
[StructLayout(LayoutKind.Explicit)]
public class OutterType
{
[FieldOffset(0)]
char blah;
[FieldOffset(1)]
char blah2;
[FieldOffset(2)]
UInt16 blah3;
[FieldOffset(4)]
InnerType details;
}
class Program
{
static void Main(string[] args)
{
var t = new OutterType();
Console.ReadLine();
}
}
Nếu tôi chạy này trên 64 clr, tôi nhận được một ngoại lệ kiểu tải,
System.TypeLoadException was unhandled
Message="Could not load type 'Sample.OutterType' from assembly 'Sample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because it contains an object field at offset 4 that is incorrectly aligned or overlapped by a non-object field."
Nếu tôi buộc các cpu mục tiêu đến 32, nó hoạt động tốt.
Ngoài ra, nếu tôi thay đổi InnerType từ một lớp thành cấu trúc, nó cũng hoạt động. Ai đó có thể giải thích những gì đang xảy ra hoặc những gì tôi đang làm sai?
nhờ
Hãy ghi nhớ rằng char là 16-bit trong .NET. blah và blah2 chồng lên nhau một phần, cũng như blah2 và blah3. – dalle