อาการ
เมื่อรหัสที่มีเป้าหมาย 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 ซึ่งแสดงไว้ในส่วน "นำไปใช้กับ"