ข้ามไปที่เนื้อหาหลัก
การสนับสนุน
ลงชื่อเข้าใช้
ลงชื่อเข้าใช้ด้วย Microsoft
ลงชื่อเข้าใช้หรือสร้างบัญชี
สวัสดี
เลือกบัญชีอื่น
คุณมีหลายบัญชี
เลือกบัญชีที่คุณต้องการลงชื่อเข้าใช้

อาการ

เมื่อรหัสที่มีเป้าหมาย Microsoft .NET Framework 4.5.1 หรือ Microsoft .NET Framework 4.5.2 และรหัสแบบไดนามิก ที่ผูกกับ วิธีการ (ตัวอย่างเช่น โดยใช้สคริปต์ใน Windows PowerShell, IronPython, IronRuby หรือภาษาไดนามิกอื่น) เรียกวิธีการSystem.Runtime.InteropServices.Marshal.SizeOfหรือวิธีการSystem.Runtime.InteropServices.Marshal.PtrToStructureคุณอาจพบปัญหาต่อไปนี้

หมายเหตุ รหัสที่คอมไพล์แล้วลงในแฟ้มโปรแกรมที่มีการจัดการไม่ปกติปัญหาเหล่านี้ ยกเว้นว่ารหัสที่ใช้คำสำคัญแบบไดนามิกใน C#

ปัญหาที่ 1

เรียกใช้System.Runtime.InteropServices.Marshal.SizeOfอยู่นอกกระบวนข้อยกเว้นต่อไปนี้ของMethodInvocationException :

ไม่มีการจัดเรียงข้อมูลเป็นโครงสร้างไม่มีการจัดการ ชนิด ' <ชื่อชนิด>' ขนาดที่มีความหมายหรือค่าออฟเซตไม่สามารถถูกคำนวณ

ปัญหาที่ 2

เรียกใช้System.Runtime.InteropServices.Marshal.PtrToStructureอยู่นอกกระบวนข้อยกเว้นต่อไปนี้ของMethodInvocationException :

โครงสร้างที่ระบุต้องเป็น blittable หรือมีข้อมูลเค้าโครง


ปัญหาที่ 3

เรียกใช้System.Runtime.InteropServices.Marshal.PtrToStructureอยู่นอกกระบวนข้อยกเว้นต่อไปนี้ของRuntimeBinderException :

ไม่สามารถแปลงชนิด 'ยกเลิก' เพื่อ 'วัตถุ' นัย


สาเหตุ

ปัญหานี้เกิดขึ้นเนื่องจากสคริปต์ engines และภาษาไดนามิกอาจผูกกับโอเวอร์โหลดใหม่ที่ถูกนำมาใช้ใน.NET Framework โดยเฉพาะ เรียกที่เคย ใช้Marshal.SizeOf(Type)เดี๋ยวนี้อาจเรียกMarshal.SizeOf < T > (T), และเรียกที่ใช้Marshal.PtrToStructure (IntPtr ชนิด)อาจเรียกเดี๋ยวนี้Marshal.PtrToStructure < T >(IntPtr, T) การเปลี่ยนแปลงนี้ทำให้วิธีการหรือรันไทม์ปกจะออกใช้ข้อยกเว้น

วิธีแก้ปัญหา

เมื่อต้องการหลีกเลี่ยงปัญหานี้ เปลี่ยนรหัสเพื่อให้ใช้มากเกินที่ถูกต้องถ้าภาษาของคุณช่วยให้คุณสามารถทำเช่นนี้ ถ้าคุณไม่ระบุการโอเวอร์โหลดวิธีเฉพาะ เปลี่ยนรหัสเพื่อให้ใช้การโอเวอร์โหลดวิธีใหม่ได้อย่างถูกต้องแทน

สำหรับเรียกไดนามิก C#

เพิ่มเพี้ยนแบบภายในการเรียกวิธีการSizeOfหรือวิธีการPtrToStructure system.type ที่ซีเรียลไลซ์ ตัวอย่างเช่น

object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);


หมายเหตุ เฉพาะจำเป็นเมื่ออาร์กิวเมนต์ไปยังเมธอดเป็นแบบไดนามิก

สำหรับ Windows PowerShell สคริปต์

เพิ่มเพี้ยนแบบภายในการเรียกวิธีการSizeOfหรือวิธีการPtrToStructure system.type ที่ซีเรียลไลซ์ ตัวอย่างเช่น

$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)

สำหรับสคริปต์ IronPython

สร้างอินสแตนซ์ชนิดใหม่ของชนิด และจากนั้น ใช้โอเวอร์โหลดของวิธีการใหม่ ตัวอย่างเช่น

typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)

obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

สถานะ

Microsoft ยืนยันว่านี่เป็นปัญหาในผลิตภัณฑ์ของ Microsoft ซึ่งแสดงไว้ในส่วน "นำไปใช้กับ"

ข้อมูลอ้างอิง

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่

ต้องการตัวเลือกเพิ่มเติมหรือไม่

สํารวจสิทธิประโยชน์ของการสมัครใช้งาน เรียกดูหลักสูตรการฝึกอบรม เรียนรู้วิธีการรักษาความปลอดภัยอุปกรณ์ของคุณ และอื่นๆ

ชุมชนช่วยให้คุณถามและตอบคําถาม ให้คําติชม และรับฟังจากผู้เชี่ยวชาญที่มีความรู้มากมาย

ข้อมูลนี้เป็นประโยชน์หรือไม่

คุณพึงพอใจกับคุณภาพภาษาเพียงใด
สิ่งที่ส่งผลต่อประสบการณ์ใช้งานของคุณ
เมื่อกดส่ง คำติชมของคุณจะถูกใช้เพื่อปรับปรุงผลิตภัณฑ์และบริการของ Microsoft ผู้ดูแลระบบ IT ของคุณจะสามารถรวบรวมข้อมูลนี้ได้ นโยบายความเป็นส่วนตัว

ขอบคุณสำหรับคำติชมของคุณ!

×