Symptômes
Lorsque le code qui cible le.NET Framework de Microsoft 4.5.1 ou le.NET Framework de Microsoft 4.5.2 et le code dynamiquement lie à méthodes (par exemple, à l’aide d’un script dans Windows PowerShell, IronPython, IronRuby ou un autre langage dynamique) appelle la méthode System.Runtime.InteropServices.Marshal.SizeOf ou la méthode System.Runtime.InteropServices.Marshal.PtrToStructure , vous pouvez rencontrer les problèmes suivants.
Remarque : Code qui est déjà compilé dans un fichier exécutable managé ne présente pas ces problèmes, à moins que le code utilise le mot clé dynamique dans C#.Problème 1
Les appels à System.Runtime.InteropServices.Marshal.SizeOf lèvent l’exception MethodInvocationException suivante :
Type ' <nom du Type>' ne peut pas être marshalé comme une structure non managée ; aucune taille ou un offset ne peut être calculée.
Problème 2
Les appels à System.Runtime.InteropServices.Marshal.PtrToStructure lèvent l’exception MethodInvocationException suivante :
La structure spécifiée doit être blittable ou avoir des informations de mise en page.
Problème 3
Les appels à System.Runtime.InteropServices.Marshal.PtrToStructure lèvent l’exception RuntimeBinderException suivante :
Ne peut pas convertir implicitement le type 'void' à 'object'.
Cause
Ce problème se produit parce que les moteurs de script et les langages dynamiques peuvent être liés à une nouvelle surcharge qui est introduite dans le.NET Framework. En particulier, appels précédemment utilisé Marshal.SizeOf(Type) peuvent maintenant appeler Marshal.SizeOf < T > (T)et appels utilisés Marshal.PtrToStructure (IntPtr, Type) peuvent maintenant appeler Marshal.PtrToStructure < T >(IntPtr, T). Cette modification entraîne les méthodes ou le classeur d’exécution pour lever une exception.
Solution de contournement
Pour contourner ce problème, modifiez le code afin qu’il utilise la surcharge correcte si votre langue vous permet de faire cela. Si vous ne pouvez pas spécifier une surcharge de méthode spécifique, modifiez le code afin qu’il utilise la surcharge de méthode nouveau correctement à la place.
Pour un appel dynamique C#
Ajouter un cast à System.Type dans l’appel à la méthode SizeOf ou PtrToStructure. Par exemple :
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Remarque : Cela est nécessaire uniquement lorsqu’un des arguments de la méthode est dynamique.
Pour les scripts Windows PowerShell
Ajouter un cast à System.Type dans l’appel à la méthode SizeOf ou PtrToStructure. Par exemple :
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Pour les scripts d’IronPython
Créer une nouvelle instance de type du type et utilisez la nouvelle surcharge de la méthode. Par exemple :
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance) obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
État
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».