الاستثناءات في Windows PowerShell واللغات الديناميكية الأخرى وتعليمة C# البرمجية المنفذة ديناميكيا عندما تستدعي التعليمات البرمجية التي تستهدف .NET Framework بعض الأساليب

ينطبق على
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 التالي:

ملاحظة

يجب أن تكون البنية المحددة قابلة للتهديد أو تحتوي على معلومات التخطيط.

          

المشكلة 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 المُدرجة في القسم "ينطبق على".

المراجع