Définition d'une méthode avec l'émission de réflexion
Cette section explique comment utiliser l'émission de réflexion pour définir des méthodes globales et des méthodes comme membres de types. Les API qui définissent des méthodes retournent des objets MethodBuilder.
La méthode MethodBuilder.AddDeclarativeSecurity ajoute la sécurité déclarative à une méthode en cours de génération. AddDeclarativeSecurity peut être appelée plusieurs fois à chaque appel spécifiant une action de sécurité (telle que Demand, Assert, Deny) et un jeu d'autorisations auquel l'action s'applique.
Une méthode globale est définie en utilisant la méthode ModuleBuilder.DefineGlobalMethod. DefineGlobalMethod retourne un MethodBuilder.
Les méthodes globales doivent être statiques. Si un module dynamique contient des méthodes globales, la méthode ModuleBuilder.CreateGlobalFunctions doit être appelée avant de rendre le module dynamique ou l'assembly dynamique conteneur persistant car le Common Language Runtime diffère la correction du module dynamique jusqu'à ce que toutes les fonctions globales soient définies.
Une méthode native globale est définie en utilisant la méthode ModuleBuilder.DefinePInvokeMethod. Les méthodes d'appel de code non managé (PInvoke) ne doivent être déclarées ni abstract ni virtual. Le runtime définit l'attribut MethodAttributes.PInvokeImpl pour une méthode d'appel de code non managé.
Une méthode est définie comme un membre de type à l'aide de la méthode TypeBuilder.DefineMethod. DefineMethod retourne un MethodBuilder.
La méthode DefineParameter est utilisée pour définir le nom et les attributs d'un paramètre ou de la valeur de retour. L'objet ParameterBuilder retourné par cette méthode représente un paramètre ou la valeur de retour. L'objet ParameterBuilder peut être utilisé pour définir le marshaling, définir la valeur de constante et appliquer des attributs personnalisés.
Remarque |
---|
Dans les versions 1.0 et 1.1 du .NET Framework, la méthode DefineParameter ne peut pas être utilisée sur la valeur de retour. |
Attributs
Les méthodes statiques sont spécifiées en utilisant l'attribut MethodAttributes.Static.
Les méthodes finales (les méthodes qui ne peuvent pas être substituées) sont spécifiées en utilisant l'attribut MethodAttributes.Final.
Les méthodes virtual sont spécifiées en utilisant l'attribut MethodAttributes.Virtual.
Les méthodes abstract sont spécifiées en utilisant l'attribut MethodAttributes.Abstract.
Plusieurs attributs déterminent la visibilité de la méthode. Consultez la description de l'énumération MethodAttributes.
Les méthodes qui implémentent des opérateurs surchargés doivent définir l'attribut MethodAttributes.SpecialName.
Les finaliseurs doivent définir l'attribut MethodAttributes.SpecialName.
Problèmes connus
Bien que la méthode MethodBuilder soit dérivée de MethodInfo, certaines des méthodes abstract définies dans la classe MethodInfo ne sont pas totalement implémentées dans MethodBuilder. Ces méthodes MethodBuilder lèvent NotSupportedException. Par exemple, la méthode MethodBuilder.Invoke n'est pas totalement implémentée. Vous pouvez refléter ces méthodes en extrayant le type englobant en utilisant Type.GetType ou Assembly.GetType.
Les modificateurs personnalisés sont pris en charge dans le .NET Framework version 2.0. Ils ne sont pas pris en charge dans les versions précédentes.