Classe System.Reflection.Emit.DynamicMethod

Cet article vous offre des remarques complémentaires à la documentation de référence pour 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 case activée de visibilité du compilateur JIT, s’il a été accordé ReflectionPermission avec l’indicateurReflectionPermissionFlag.RestrictedMemberAccess. Le niveau d’approbation de l’assembly dont les membres non publics sont accessibles par la méthode dynamique doit être égal ou un sous-ensemble 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 internal les membres (Friend en Visual Basic) des types. Vous pouvez associer une méthode dynamique à n’importe quel module, que vous ayez créé le module, à condition qu’une demande avec ReflectionPermission l’indicateur RestrictedMemberAccess puisse être satisfaite par la pile des appels qui inclut votre code. Si l’indicateur ReflectionPermissionFlag.MemberAccess est inclus dans l’octroi, la méthode dynamique peut ignorer les case activée 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 case activée 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 être accordé ReflectionPermission avec les indicateurs et MemberAccess les RestrictedMemberAccess indicateurs.

Le tableau suivant indique quels types et membres sont accessibles à une méthode dynamique hébergée anonymement, avec et sans case activée de visibilité JIT, selon que ReflectionPermission l’indicateur RestrictedMemberAccess est accordé.

Visibilité case activée s Sans RestrictedMemberAccess Avec RestrictedMemberAccess
Sans ignorer les case activée de visibilité JIT Membres publics de types publics dans n’importe quel assembly. Membres publics de types publics dans n’importe quel assembly.
Ignorer les case activée de visibilité JIT, avec des restrictions Membres publics de types publics dans n’importe quel assembly. Tous les membres de tous les types, uniquement dans les assemblys dont les niveaux d’approbation sont égaux ou inférieurs au niveau d’approbation de l’assembly qui a émis 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 case activée de visibilité JIT Associé au module Associé au type
Non Membres publics et internes de types publics, internes et privés dans le module.

Membres publics de 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 de types publics dans n’importe quel assembly.
Oui Tous les membres de tous les types d’un assembly. Tous les membres de tous les types d’un 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 static des méthodes (Shared méthodes en Visual Basic), les règles assouplies pour la liaison de délégué permettent à une méthode dynamique d’être liée à un objet, afin qu’elle agisse comme une méthode d’instance lorsqu’elle est appelée à l’aide de cette instance de délégué. Un exemple qui illustre cela est fourni pour la CreateDelegate(Type, Object) surcharge de méthode.

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 Code transparent de sécurité, 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 Code transparent de sécurité, 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 appelez une méthode dynamique à l’aide d’un délégué retourné par la CreateDelegate méthode, une VerificationException méthode est levée. Si vous appelez la méthode dynamique à l’aide de la Invoke méthode, une TargetInvocationException exception est levée avec un élément interne VerificationException.