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ò avere la possibilità di ignorare i controlli di visibilità del compilatore JIT, se è stato concesso ReflectionPermission con il ReflectionPermissionFlag.RestrictedMemberAccess flag . Il livello di attendibilità dell'assembly ai cui membri non pubblici è accessibile dal metodo dinamico deve essere uguale o un subset di , il livello di attendibilità dello stack di chiamate che ha generato 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 nel modulo e a tutti i internal membri (Friend in Visual Basic) dei tipi. È possibile associare un metodo dinamico a qualsiasi modulo, indipendentemente dal fatto che il modulo sia stato creato, purché una richiesta per ReflectionPermission il RestrictedMemberAccess flag 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.

    Nota

    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 ReflectionPermission ai RestrictedMemberAccess flag e MemberAccess .

Nella tabella seguente vengono illustrati i tipi e i membri accessibili a un metodo dinamico ospitato in modo anonimo, con e senza controlli di visibilità JIT, a seconda che ReflectionPermission venga concesso il RestrictedMemberAccess flag.

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 i cui livelli di attendibilità sono uguali o minori del 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 assembly. Tutti i membri di tutti i tipi in qualsiasi assembly.

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 relaxed per l'associazione del delegato consentono di associare un metodo dinamico a un oggetto, in modo che funzioni come un metodo di istanza quando viene chiamato utilizzando tale istanza di delegato. Un esempio che illustra questa operazione viene fornita per l'overload del CreateDelegate(Type, Object) metodo.

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 è anche critico per la sicurezza e può ignorare la verifica. Ad esempio, un assembly senza attributi di sicurezza eseguiti come applicazione desktop viene considerato 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 Codice trasparente per la sicurezza, 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 Codice trasparente per la sicurezza, 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.