Condividi tramite


Classe System.Reflection.Emit.DynamicMethod

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

È possibile usare la DynamicMethod classe per generare ed eseguire un metodo in fase di esecuzione, senza dover generare un assembly dinamico e un tipo dinamico per contenere il metodo . Il codice eseguibile creato dal compilatore JIT (Just-In-Time) viene recuperato quando l'oggetto DynamicMethod viene recuperato. I metodi dinamici sono il modo più efficiente per generare ed eseguire piccole quantità di codice.

Un metodo dinamico può essere ospitato in modo anonimo oppure può essere associato logicamente a un modulo o a un tipo.

  • Se il metodo dinamico è ospitato in modo anonimo, si trova in un assembly fornito dal sistema e pertanto è isolato da altro codice. Per impostazione predefinita, non ha accesso a dati non pubblici. Un metodo dinamico ospitato in modo anonimo può ignorare i controlli di visibilità del compilatore JIT, se è stato concesso ReflectionPermission con flag ReflectionPermissionFlag.RestrictedMemberAccess. Il livello di attendibilità dell'assembly i cui membri non pubblici vengono acceduti dal metodo dinamico deve essere uguale o un subset di, il livello di attendibilità dello stack di chiamate che ha emesso il metodo dinamico. Per altre informazioni sui metodi dinamici ospitati in modo anonimo, vedere Procedura dettagliata: creazione di codice in scenari di attendibilità parziale.

  • Se il metodo dinamico è associato a un modulo specificato, il metodo dinamico è effettivamente globale per tale modulo. Può accedere a tutti i tipi presenti nel modulo e a tutti i membri di tipo internal (Friend in Visual Basic). È possibile associare un metodo dinamico a qualsiasi modulo, indipendentemente dal fatto che sia stato creato il modulo, purché una richiesta per ReflectionPermission con il flag RestrictedMemberAccess possa essere soddisfatta dallo stack di chiamate che include il codice. Se il ReflectionPermissionFlag.MemberAccess flag è incluso nella concessione, il metodo dinamico può ignorare i controlli di visibilità del compilatore JIT e accedere ai dati privati di tutti i tipi dichiarati nel modulo o in qualsiasi altro modulo in qualsiasi assembly.

    Annotazioni

    Quando si specifica il modulo a cui è associato un metodo dinamico, tale modulo non deve trovarsi nell'assembly fornito dal sistema usato per l'hosting anonimo.

  • Se il metodo dinamico è associato a un tipo specificato, ha accesso a tutti i membri del tipo, indipendentemente dal livello di accesso. Inoltre, è possibile ignorare i controlli di visibilità JIT. In questo modo il metodo dinamico accede ai dati privati di altri tipi dichiarati nello stesso modulo o in qualsiasi altro modulo in qualsiasi assembly. È possibile associare un metodo dinamico a qualsiasi tipo, ma il codice deve essere concesso con entrambi i flag ReflectionPermission e RestrictedMemberAccess.

La tabella seguente mostra quali tipi e membri sono accessibili a un metodo dinamico ospitato anonimamente, con e senza i controlli di visibilità JIT, a seconda che venga concesso il flag ReflectionPermission con l'opzione RestrictedMemberAccess.

Controlli di visibilità Senza RestrictedMemberAccess Con RestrictedMemberAccess
Senza ignorare i controlli di visibilità JIT Membri pubblici di tipi pubblici in qualsiasi assembly. Membri pubblici di tipi pubblici in qualsiasi assembly.
Ignorare i controlli di visibilità JIT, con restrizioni Membri pubblici di tipi pubblici in qualsiasi assembly. Tutti i membri di tutti i tipi, solo negli assembly dove i livelli di attendibilità sono uguali o inferiori al livello di attendibilità dell'assembly che ha generato il metodo dinamico.

Nella tabella seguente vengono illustrati i tipi e i membri accessibili a un metodo dinamico associato a un modulo o a un tipo in un modulo.

Ignorare i controlli di visibilità JIT Associato al modulo Associato al tipo
NO Membri pubblici e interni di tipi pubblici, interni e privati nel modulo.

Membri pubblici di tipi pubblici in qualsiasi assembly.
Tutti i membri del tipo associato. Membri pubblici e interni di tutti gli altri tipi del modulo.

Membri pubblici di tipi pubblici in qualsiasi assembly.
Tutti i membri di tutti i tipi in qualsiasi assemblaggio. Tutti i membri di tutti i tipi in qualsiasi assemblaggio.

Un metodo dinamico associato a un modulo dispone delle autorizzazioni di tale modulo. Un metodo dinamico associato a un tipo dispone delle autorizzazioni del modulo contenente tale tipo.

I metodi dinamici e i relativi parametri non devono essere denominati, ma è possibile specificare i nomi per facilitare il debug. Gli attributi personalizzati non sono supportati nei metodi dinamici o nei relativi parametri.

Anche se i metodi dinamici sono static metodi (Shared metodi in Visual Basic), le regole rilassate per il binding del delegato consentono di associare un metodo dinamico a un oggetto, in modo che, utilizzando tale istanza di delegato, funzioni come un metodo di istanza quando viene chiamato. Un esempio che illustra questa operazione viene fornito per l'overload del metodo CreateDelegate(Type, Object).

Verifica

L'elenco seguente riepiloga le condizioni in cui i metodi dinamici possono contenere codice non verificabile. Ad esempio, un metodo dinamico non è verificabile se la relativa InitLocals proprietà è impostata su false.

  • Un metodo dinamico associato a un assembly critico per la sicurezza è anch'esso critico e può ignorare la verifica. Ad esempio, un assembly senza attributi di sicurezza eseguito come applicazione desktop viene considerato come componente critico per la sicurezza dal runtime. Se si associa un metodo dinamico all'assembly, il metodo dinamico può contenere codice non verificabile.
  • Se un metodo dinamico che contiene codice non verificabile è associato a un assembly con trasparenza di livello 1, il compilatore JIT inserisce una richiesta di sicurezza. La richiesta ha esito positivo solo se il metodo dinamico viene eseguito da codice completamente attendibile. Vedere codiceSecurity-Transparent, livello 1.
  • Se un metodo dinamico che contiene codice non verificabile è associato a un assembly con trasparenza di livello 2 ( ad esempio mscorlib.dll), genera un'eccezione (inserita dal compilatore JIT) anziché effettuare una richiesta di sicurezza. Vedere codiceSecurity-Transparent, livello 2.
  • Un metodo dinamico ospitato in modo anonimo che contiene codice non verificabile genera sempre un'eccezione. Non può mai ignorare la verifica, anche se viene creata ed eseguita da codice completamente attendibile.

L'eccezione generata per il codice non verificabile varia a seconda del modo in cui viene richiamato il metodo dinamico. Se si richiama un metodo dinamico utilizzando un delegato restituito dal CreateDelegate metodo , viene generata un'eccezione VerificationException . Se si richiama il metodo dinamico usando il Invoke metodo , viene generata un'eccezione TargetInvocationException con un oggetto interno VerificationException.