الأعراض
عندما ترتبط التعليمات البرمجية التي تستهدف 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 التالي:
ملاحظة
يجب أن تكون البنية المحددة قابلة للتهديد أو تحتوي على معلومات التخطيط.
المشكلة 3
تقوم المكالمات إلى System.Runtime.InteropServices.Marshal.PtrToStructure بطرح استثناء RuntimeBinderException التالي:
ملاحظة
لا يمكن تحويل النوع "voide" إلى "object" ضمنيا.
السبب
تحدث هذه المشكلة لأن محركات البرمجة النصية واللغات الديناميكية قد ترتبط بالتحميل الزائد الجديد الذي يتم تقديمه في .NET Framework. بشكل خاص، قد تستدعي الآن الاستدعاءات التي كانت تستخدم سابقا Marshal.SizeOf(Type) Marshal.SizeOf<T>(T)، وقد تستدعي الآن الاستدعاءات التي استخدمت Marshal.PtrToStructure(IntPtr, Type) Marshal.PtrToStructure<T>(IntPtr, T). يتسبب هذا التغيير في قيام الطرق أو رابط وقت التشغيل بطرح استثناء.
الحل البديل
لحل هذه المشكلة، قم بتغيير التعليمات البرمجية بحيث تستخدم التحميل الزائد الصحيح إذا كانت لغتك تتيح لك القيام بذلك. إذا لم تتمكن من تحديد طريقة معينة للتحميل الزائد، فقم بتغيير التعليمات البرمجية بحيث تستخدم طريقة جديدة التحميل الزائد بشكل صحيح بدلا من ذلك.
للاستدعاء الديناميكي C#
أضف Cast إلى System.Type داخل أسلوب الاستدعاء إلى SizeOf أو method PtrToStructure. على سبيل المثال:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);
int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
ملاحظة: هذا ضروري فقط عندما تكون إحدى وسيطات الأسلوب ديناميكية.
للبرامج النصية ل Windows PowerShell
أضف Cast إلى System.Type داخل أسلوب الاستدعاء إلى SizeOf أو method PtrToStructure. على سبيل المثال:
$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 المُدرجة في القسم "ينطبق على".