تخطي إلى المحتوى الرئيسي
الدعم
تسجيل الدخول باستخدام حساب Microsoft
تسجيل الدخول أو إنشاء حساب.
مرحباً،
تحديد استخدام حساب مختلف!
لديك حسابات متعددة
اختر الحساب الذي تريد تسجيل الدخول باستخدامه.

الأعراض

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

المراجع

هل تحتاج إلى مزيد من المساعدة؟

الخروج من الخيارات إضافية؟

استكشف مزايا الاشتراك، واستعرض الدورات التدريبية، وتعرف على كيفية تأمين جهازك، والمزيد.

تساعدك المجتمعات على طرح الأسئلة والإجابة عليها، وتقديم الملاحظات، وسماعها من الخبراء ذوي الاطلاع الواسع.

هل كانت المعلومات مفيدة؟

ما مدى رضاك عن جودة اللغة؟
ما الذي أثّر في تجربتك؟
بالضغط على "إرسال"، سيتم استخدام ملاحظاتك لتحسين منتجات Microsoft وخدماتها. سيتمكن مسؤول تكنولوجيا المعلومات لديك من جمع هذه البيانات. بيان الخصوصية.

نشكرك على ملاحظاتك!

×