Applies ToWindows 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, הקוד באופן דינמי מאגדת שיטות (לדוגמה, שימוש ב- script ב- Windows PowerShell, IronPython, IronRuby או שפה אחרת דינאמי) קוראת את שיטת System.Runtime.InteropServices.Marshal.SizeOf או בשיטה System.Runtime.InteropServices.Marshal.PtrToStructure , אתה עלול להיתקל בבעיות הבאות.הערה קוד כבר הידור לתוך קובץ הפעלה מנוהלים לא שהפגינו בעיות אלה, אלא אם קוד זה עושה שימוש במילת המפתח דינמי ב- c#.

בעיה 1

קריאות ל- System.Runtime.InteropServices.Marshal.SizeOf להתריע על החריגה MethodInvocationException הבאה:

סוג ' <שם סוגשל >' אינו יכול להיות marshalled כמבנה לא מנוהל; אפשרות לחשב לא גודל או היסט משמעותיים.

בעיה 2

קריאות ל- System.Runtime.InteropServices.Marshal.PtrToStructure להתריע על החריגה MethodInvocationException הבאה:

המבנה שצוין חייב להיות פרמיטיביים או לכלול נתוני פריסה.

בעיה 3

קריאות ל- System.Runtime.InteropServices.Marshal.PtrToStructure להתריע על החריגה RuntimeBinderException הבאה:

אין אפשרות להמיר באופן מפורש את סוג 'void' 'אובייקט'.

הגורם

בעיה זו מתרחשת מאחר scripting מנגנוני ואיגוד שפות דינמי עלול להעמיס החדשה שהוצגה ב- .NET Framework. באופן ספציפי, שיחות שהיו בעבר Marshal.SizeOf(Type) עלול לקרוא כעת Marshal.SizeOf < T > (T), והתקשר שיחות בשימוש Marshal.PtrToStructure (IntPtr, סוג) ייתכן כעת Marshal.PtrToStructure < T >(IntPtr, T). שינוי זה גורם השיטות או האוגדן זמן ריצה כדי להתריע על מצב חריג.

פתרון הבעיה

כדי לעקוף בעיה זו, שנה את הקוד כך שישתמש להעמיס הנכון אם השפה שלך מאפשר לך לעשות זאת. אם אין באפשרותך לציין עומס יתר של שיטה מסוימת, לשנות את הקוד כך שישתמש להעמיס שיטה חדשה כראוי במקום זאת.

עבור בקשה דינאמי C#

הוספת הטלת System.Type בתוך קריאה לפעולת שירות SizeOf או שיטת PtrToStructure. לדוגמה:

object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);

הערה הדבר נחוץ רק כאשר אחד מהארגומנטים לשיטה הוא דינאמי.

עבור קבצי script של Windows PowerShell

הוספת הטלת System.Type בתוך קריאה לפעולת שירות SizeOf או שיטת PtrToStructure. לדוגמה:

$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)

עבור קבצי script של IronPython

יצירת מופע סוג חדש של הסוג, ולאחר מכן השתמש להעמיס שיטה חדשה. לדוגמה:

typeInstance = type()size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

מצב

Microsoft אישרה כי מדובר בבעיה במוצרי Microsoft הרשומים במקטע 'חל על'.

הפניות

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

גלה את יתרונות המנוי, עיין בקורסי הדרכה, למד כיצד לאבטח את המכשיר שלך ועוד.

קהילות עוזרות לך לשאול שאלות ולהשיב עליהן, לתת משוב ולשמוע ממומחים בעלי ידע עשיר.