Triệu chứng
Khi mã nhắm mục tiêu Microsoft .NET Framework 4.5.1 hoặc Microsoft .NET Framework 4.5.2 và mã tự động liên kết với phương pháp (ví dụ, bằng cách sử dụng tập lệnh Windows PowerShell, IronPython, IronRuby hoặc một ngôn ngữ động) gọi System.Runtime.InteropServices.Marshal.SizeOf phương pháp System.Runtime.InteropServices.Marshal.PtrToStructure hoặc, bạn có thể gặp phải các vấn đề.
Lưu ý Mã được đưa vào thực thi được quản lý không hiển thị các vấn đề, nếu mã sử dụng động từ khóa trong C#.
Vấn đề 1
Cuộc gọi đến System.Runtime.InteropServices.Marshal.SizeOf ném một ngoại lệ MethodInvocationException sau:
Loại ' <tên loại>' không thể được marshalled như là một cấu trúc không được quản lý; không có ý nghĩa kích thước hoặc bù có thể được tính.
Vấn đề 2
Cuộc gọi đến System.Runtime.InteropServices.Marshal.PtrToStructure ném một ngoại lệ MethodInvocationException sau:
Cấu trúc quy định phải là blittable hoặc có bố trí thông tin.
Vấn đề 3
Cuộc gọi đến System.Runtime.InteropServices.Marshal.PtrToStructure ném một ngoại lệ RuntimeBinderException sau:
Hoàn toàn không thể chuyển nhập 'void' 'đối tượng'.
Nguyên nhân
Sự cố này xảy ra do kịch bản công cụ và ngôn ngữ động có thể liên kết với một quá tải mới được giới thiệu trong .NET Framework. Cụ thể, trước đây sử dụng Marshal.SizeOf(Type) các cuộc gọi có thể gọi Marshal.SizeOf < T > (T), và sử dụng Marshal.PtrToStructure (IntPtr, loại) các cuộc gọi có thể gọi Marshal.PtrToStructure < T >(IntPtr, T). Thay đổi này khiến phương pháp hoặc hồ sơ thời gian chạy để ném một ngoại lệ.
Giải pháp
Để khắc phục sự cố này, thay đổi mã để sử dụng quá tải đúng nếu ngôn ngữ của bạn cho phép bạn thực hiện việc này. Nếu bạn không thể chỉ định một quá tải phương pháp cụ thể, thay đổi mã để sử dụng quá tải phương pháp mới đúng thay thế.
Đối với C# động lệnh gọi
Thêm một System.Type trong các cuộc gọi đến phương pháp SizeOf hoặc phương pháp PtrToStructure. Ví dụ:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Lưu ý Điều này chỉ cần thiết khi một trong các đối số phương pháp động.
Đối với tập lệnh Windows PowerShell
Thêm một System.Type trong các cuộc gọi đến phương pháp SizeOf hoặc phương pháp PtrToStructure. Ví dụ:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Đối với kịch bản IronPython
Tạo loại phiên bản mới của các loại, và sau đó sử dụng quá tải phương pháp mới. Ví dụ:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Trạng thái
Microsoft đã xác nhận rằng đây là sự cố trong sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".