Bỏ qua để tới nội dung chính
Đăng nhập với Microsoft
Đăng nhập hoặc tạo một tài khoản.
Xin chào,
Chọn một tài khoản khác.
Bạn có nhiều tài khoản
Chọn tài khoản bạn muốn đăng nhập.

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".

Tham khảo

Bạn cần thêm trợ giúp?

Bạn muốn xem các tùy chọn khác?

Khám phá các lợi ích của gói đăng ký, xem qua các khóa đào tạo, tìm hiểu cách bảo mật thiết bị của bạn và hơn thế nữa.

Cộng đồng giúp bạn đặt và trả lời các câu hỏi, cung cấp phản hồi và lắng nghe ý kiến từ các chuyên gia có kiến thức phong phú.

Thông tin này có hữu ích không?

Bạn hài lòng đến đâu với chất lượng dịch thuật?
Điều gì ảnh hưởng đến trải nghiệm của bạn?
Khi nhấn gửi, phản hồi của bạn sẽ được sử dụng để cải thiện các sản phẩm và dịch vụ của Microsoft. Người quản trị CNTT của bạn sẽ có thể thu thập dữ liệu này. Điều khoản về quyền riêng tư.

Cảm ơn phản hồi của bạn!

×