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