นำไปใช้กับ
Windows Vista Service Pack 2 Windows 7 Service Pack 1 Windows Server 2008 Service Pack 2 Windows Server 2008 R2 Service Pack 1 Windows 8 Windows Server 2012 Datacenter Windows Server 2012 Datacenter Windows Server 2012 Essentials Windows Server 2012 Foundation Windows Server 2012 Foundation Windows Server 2012 Standard Windows Server 2012 Standard Windows Server 2012 R2 Datacenter Windows Server 2012 R2 Essentials Windows Server 2012 R2 Foundation Windows Server 2012 R2 Standard Windows 8.1

อาการ

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

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

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

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

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