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

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 à ».

Références

Besoin d’aide ?

Vous voulez plus d’options ?

Explorez les avantages de l’abonnement, parcourez les cours de formation, découvrez comment sécuriser votre appareil, etc.

Les communautés vous permettent de poser des questions et d'y répondre, de donner vos commentaires et de bénéficier de l'avis d'experts aux connaissances approfondies.