Definizione di un metodo tramite reflection emit
In questa sezione verrà descritto come utilizzare la reflection emit per definire metodi globali e per definire i metodi come membri di un tipo. Le API che definiscono i metodi restituiscono oggetti MethodBuilder.
Il metodo MethodBuilder.AddDeclarativeSecurity aggiunge sicurezza dichiarativa al metodo compilato. È possibile chiamare più volte AddDeclarativeSecurity specificando a ogni chiamata un'azione di sicurezza (quale Demand, Assert, Deny) e un set di autorizzazioni a cui si applica l'azione.
Un metodo globale viene definito mediante il metodo ModuleBuilder.DefineGlobalMethod. DefineGlobalMethod restituisce un MethodBuilder.
È necessario che i metodi globali siano statici. Se un modulo dinamico contiene metodi globali, è necessario chiamare il metodo ModuleBuilder.CreateGlobalFunctions prima che venga reso persistente il modulo dinamico o l'assembly dinamico che lo contiene, perché in Common Language Runtime la correzione del modulo dinamico viene operata solo dopo la definizione di tutte le funzioni globali.
Un metodo globale nativo viene definito tramite il metodo ModuleBuilder.DefinePInvokeMethod. I metodi di platform invoke (PInvoke) non devono essere dichiarati come astratti o virtuali. L'attributo MethodAttributes.PInvokeImpl per il metodo di platform invoke viene impostato dal runtime.
Per definire un metodo come membro di tipo è necessario utilizzare il metodo TypeBuilder.DefineMethod. DefineMethod restituisce un MethodBuilder.
Il metodo DefineParameter viene utilizzato per impostare gli attributi nome e parametro di un parametro o del valore restituito. L'oggetto ParameterBuilder restituito da questo metodo rappresenta un parametro o il valore restituito. L'oggetto ParameterBuilder può essere utilizzato per impostare il marshalling e il valore costante e per applicare attributi personalizzati.
Nota |
---|
In .NET Framework versioni 1.0 e 1.1 il metodo DefineParameter non può essere utilizzato sul valore restituito. |
Attributi
I metodi statici vengono specificati mediante l'attributo MethodAttributes.Static.
I metodi finali, ovvero di cui non è possibile eseguire l'override, vengono specificati mediante l'attributo MethodAttributes.Final.
I metodi virtuali vengono specificati mediante l'attributo MethodAttributes.Virtual.
I metodi astratti vengono specificati mediante l'attributo MethodAttributes.Abstract.
La visibilità del metodo è determinata da vari attributi. Vedere la descrizione dell'enumerazione MethodAttributes.
È necessario che i metodi che implementano operatori di overload impostino l'attributo MethodAttributes.SpecialName.
È necessario che i finalizzatori impostino l'attributo MethodAttributes.SpecialName.
Problemi noti
Sebbene MethodBuilder derivi da MethodInfo, alcuni dei metodi astratti definiti nella classe MethodInfo non sono implementati completamente in MethodBuilder. Questi metodi MethodBuilder generano l'eccezione NotSupportedException. Il metodo MethodBuilder.Invoke, ad esempio, non viene implementato completamente. È possibile operare una reflection su questi metodi recuperando il tipo che li contiene tramite Type.GetType o Assembly.GetType.
I modificatori personalizzati sono supportati in .NET Framework versione 2.0, ma non nelle versioni precedenti.