Se connecter avec Microsoft
S'identifier ou créer un compte.
Bonjour,
Sélectionnez un autre compte.
Vous avez plusieurs comptes
Choisissez le compte avec lequel vous voulez vous connecter.

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.

Ces informations vous ont-elles été utiles ?

Dans quelle mesure êtes-vous satisfait(e) de la qualité de la langue ?
Qu’est-ce qui a affecté votre expérience ?
En cliquant sur Envoyer, vos commentaires seront utilisés pour améliorer les produits et services de Microsoft. Votre administrateur informatique sera en mesure de collecter ces données. Déclaration de confidentialité.

Nous vous remercions de vos commentaires.

×