Partage via


Classe System.Reflection.Emit.DynamicMethod

Cet article fournit des remarques supplémentaires à la documentation de référence de cette API.

Vous pouvez utiliser la DynamicMethod classe pour générer et exécuter une méthode au moment de l’exécution, sans avoir à générer un assembly dynamique et un type dynamique pour contenir la méthode. Le code exécutable créé par le compilateur juste-à-temps (JIT) est récupéré lorsque l'objet DynamicMethod est récupéré. Les méthodes dynamiques constituent le moyen le plus efficace de générer et d’exécuter de petites quantités de code.

Une méthode dynamique peut être hébergée anonymement, ou elle peut être associée logiquement à un module ou à un type.

  • Si la méthode dynamique est hébergée anonymement, elle se trouve dans un assembly fourni par le système et est donc isolée d’un autre code. Par défaut, il n’a pas accès à des données non publiques. Une méthode dynamique hébergée anonymement peut avoir une capacité limitée à ignorer les vérifications de visibilité du compilateur JIT, si elle a été accordée ReflectionPermission avec l’indicateur ReflectionPermissionFlag.RestrictedMemberAccess . Le niveau de confiance de l'assembly dont les membres non publics sont accessibles par la méthode dynamique doit être égal ou inférieur au niveau de confiance de la pile d'appels qui a émis la méthode dynamique. Pour plus d’informations sur les méthodes dynamiques hébergées anonymement, consultez Procédure pas à pas : Émission de code dans des scénarios d’approbation partielle.

  • Si la méthode dynamique est associée à un module que vous spécifiez, la méthode dynamique est effectivement globale à ce module. Il peut accéder à tous les types du module et à tous les membres des types internal (Friend en Visual Basic). Vous pouvez associer une méthode dynamique à n'importe quel module, que vous ayez créé ou non le module, à condition qu'une demande pour ReflectionPermission avec l'indicateur RestrictedMemberAccess puisse être satisfaite par la pile d'appels qui inclut votre code. Si l’indicateur ReflectionPermissionFlag.MemberAccess est inclus dans l’octroi, la méthode dynamique peut ignorer les vérifications de visibilité du compilateur JIT et accéder aux données privées de tous les types déclarés dans le module ou dans tout autre module d’un assembly.

    Remarque

    Lorsque vous spécifiez le module avec lequel une méthode dynamique est associée, ce module ne doit pas se trouver dans l’assembly fourni par le système utilisé pour l’hébergement anonyme.

  • Si la méthode dynamique est associée à un type que vous spécifiez, elle a accès à tous les membres du type, quel que soit le niveau d’accès. En outre, les vérifications de visibilité JIT peuvent être ignorées. Cela permet à la méthode dynamique d’accéder aux données privées d’autres types déclarés dans le même module ou dans tout autre module d’un assembly. Vous pouvez associer une méthode dynamique à n'importe quel type, mais votre code doit disposer de ReflectionPermission avec les indicateurs RestrictedMemberAccess et MemberAccess.

Le tableau suivant indique les types et les membres accessibles à une méthode dynamique hébergée de manière anonyme, avec et sans vérifications de visibilité JIT, selon que ReflectionPermission avec l'indicateur RestrictedMemberAccess est accordé ou non.

Vérifications de visibilité Sans RestrictedMemberAccess Avec RestrictedMemberAccess
Sans ignorer les vérifications de visibilité JIT Membres publics des types publics dans n'importe quel assembly. Membres publics des types publics dans n'importe quel assembly.
Ignorer les vérifications de visibilité JIT, avec restrictions Membres publics des types publics dans n'importe quel assembly. Tous les membres de tous les types, uniquement dans les assemblées dont le niveau de confiance est égal ou inférieur au niveau de confiance de l'assemblée qui a produite la méthode dynamique.

Le tableau suivant montre quels types et membres sont accessibles à une méthode dynamique associée à un module ou à un type dans un module.

Ignorer les vérifications de visibilité JIT Associé au module Associé au type
Non Membres publics et internes des types publics, internes et privés dans le module.

Membres publics des types publics dans n'importe quel assembly.
Tous les membres du type associé. Membres publics et internes de tous les autres types du module.

Membres publics des types publics dans n'importe quel assembly.
Oui Tous les membres de tous les types de n'importe quel assembly. Tous les membres de tous les types de n'importe quel assembly.

Une méthode dynamique associée à un module dispose des autorisations de ce module. Une méthode dynamique associée à un type a les autorisations du module contenant ce type.

Les méthodes dynamiques et leurs paramètres ne doivent pas être nommés, mais vous pouvez spécifier des noms pour faciliter le débogage. Les attributs personnalisés ne sont pas pris en charge sur les méthodes dynamiques ou leurs paramètres.

Bien que les méthodes dynamiques soient des méthodes static (méthodes Shared dans Visual Basic), les règles assouplies pour la liaison de délégués permettent à une méthode dynamique d'être liée à un objet, de sorte qu'elle se comporte comme une méthode d'instance lorsqu'elle est appelée à l'aide de cette instance de délégué. Un exemple est fourni pour illustrer la surcharge de la méthode CreateDelegate(Type, Object).

Vérification

La liste suivante récapitule les conditions dans lesquelles les méthodes dynamiques peuvent contenir du code non vérifiable. (Par exemple, une méthode dynamique n’est pas vérifiable si sa InitLocals propriété est définie sur false.)

  • Une méthode dynamique associée à un assembly critique de sécurité est également critique pour la sécurité et peut ignorer la vérification. Par exemple, un assembly sans attributs de sécurité exécuté en tant qu’application de bureau est traité comme critique pour la sécurité par le runtime. Si vous associez une méthode dynamique à l’assembly, la méthode dynamique peut contenir du code non vérifiable.
  • Si une méthode dynamique qui contient du code non vérifiable est associée à un assembly qui a un niveau de transparence de niveau 1, le compilateur juste-à-temps (JIT) injecte une demande de sécurité. La demande réussit uniquement si la méthode dynamique est exécutée par du code entièrement approuvé. Consultez Security-Transparent code, niveau 1.
  • Si une méthode dynamique qui contient du code non vérifiable est associée à un assembly qui a le niveau 2 de transparence (par exemple, mscorlib.dll), elle lève une exception (injectée par le compilateur JIT) au lieu d’effectuer une demande de sécurité. Consultez Security-Transparent code, niveau 2.
  • Une méthode dynamique hébergée anonymement qui contient du code non vérifiable lève toujours une exception. Il ne peut jamais ignorer la vérification, même s’il est créé et exécuté par du code entièrement approuvé.

L’exception levée pour le code non vérifiable varie selon la façon dont la méthode dynamique est appelée. Si vous invoquez une méthode dynamique à l'aide d'un délégué retourné par la méthode CreateDelegate, un VerificationException est déclenché. Si vous appelez la méthode dynamique à l'aide de la méthode Invoke, une exception TargetInvocationException est levée avec une exception VerificationException interne.