Classe System.Reflection.Emit.DynamicMethod

Observação

Este artigo fornece observações complementares à documentação de referência para esta API.

Pode usar a DynamicMethod classe para gerar e executar um método em tempo de execução, sem ter de gerar um assembly dinâmico e um tipo dinâmico para conter o método. O código executável criado pelo compilador just-in-time (JIT) é recuperado quando o DynamicMethod objeto é recuperado. Os métodos dinâmicos são a maneira mais eficiente de gerar e executar pequenas quantidades de código.

Um método dinâmico pode ser hospedado anonimamente ou pode ser logicamente associado a um módulo ou a um tipo.

  • Se o método dinâmico é hospedado anonimamente, ele está localizado em um assembly fornecido pelo sistema e, portanto, é isolado de outro código. Por padrão, ele não tem acesso a nenhum dado não público. Um método dinâmico hospedado anonimamente pode ter a capacidade restrita de ignorar as verificações de visibilidade do compilador JIT, se lhe tiver sido concedido ReflectionPermission com a flag ReflectionPermissionFlag.RestrictedMemberAccess. O nível de confiança do assembly cujos membros não públicos são acessados pelo método dinâmico deve ser igual a, ou um subconjunto de, o nível de confiança da pilha de chamadas que emitiu o método dinâmico. Para obter mais informações sobre métodos dinâmicos hospedados anonimamente, consulte Passo a passo: emitindo código em cenários de confiança parcial.

  • Se o método dinâmico estiver associado a um módulo que você especificar, o método dinâmico será efetivamente global para esse módulo. Ele pode aceder a todos os tipos no módulo e a todos os membros internal (Friend no Visual Basic) dos tipos. Você pode associar um método dinâmico a qualquer módulo, independentemente de ter criado o módulo, desde que um pedido por ReflectionPermission com a bandeira RestrictedMemberAccess possa ser satisfeito pela pilha de chamadas que inclui o seu código. Se o ReflectionPermissionFlag.MemberAccess sinalizador estiver incluído na permissão, o método dinâmico é capaz de ignorar as verificações de visibilidade realizadas pelo compilador JIT e acessar os dados privados de todos os tipos declarados no módulo ou em qualquer outro módulo de qualquer assembly.

    Observação

    Quando você especifica o módulo ao qual um método dinâmico está associado, esse módulo não deve estar no assembly fornecido pelo sistema que é usado para hospedagem anônima.

  • Se o método dinâmico estiver associado a um tipo especificado, ele terá acesso a todos os membros do tipo, independentemente do nível de acesso. Além disso, as verificações de visibilidade JIT podem ser ignoradas. Isso dá ao método dinâmico acesso aos dados privados de outros tipos declarados no mesmo módulo ou em qualquer outro módulo em qualquer montagem. Você pode associar um método dinâmico a qualquer tipo, mas seu código deve ser concedido ReflectionPermission com os RestrictedMemberAccess sinalizadores e MemberAccess .

A tabela a seguir mostra quais tipos e membros são acessíveis a um método dinâmico hospedado anonimamente, com e sem verificações de visibilidade JIT, dependendo se é concedido o ReflectionPermission com o sinalizador RestrictedMemberAccess.

Verificações de visibilidade Sem RestrictedMemberAccess Com RestrictedMemberAccess
Sem ignorar as verificações de visibilidade JIT Membros públicos de tipos públicos em qualquer assembleia. Membros públicos de tipos públicos em qualquer assembleia.
Ignorando verificações de visibilidade do JIT, com restrições Membros públicos de tipos públicos em qualquer assembleia. Todos os membros de todos os tipos, somente em assemblies cujos níveis de confiança são iguais ou menores que o nível de confiança do assembly que emitiu o método dinâmico.

A tabela a seguir mostra quais tipos e membros são acessíveis a um método dinâmico associado a um módulo ou a um tipo em um módulo.

Ignorar verificações de visibilidade JIT Associado ao módulo Associado ao tipo
Não Membros públicos e internos dos tipos público, interno e privado no módulo.

Membros públicos de tipos públicos em qualquer assembleia.
Todos os membros do tipo associado. Membros públicos e internos de todos os outros tipos do módulo.

Membros públicos de tipos públicos em qualquer assembleia.
Sim Todos os membros de todos os tipos em qualquer tipo de assembleia. Todos os membros de todos os tipos em qualquer tipo de assembleia.

Um método dinâmico que está associado a um módulo tem as permissões desse módulo. Um método dinâmico que está associado a um tipo tem as permissões do módulo que contém esse tipo.

Os métodos dinâmicos e seus parâmetros não precisam ser nomeados, mas você pode especificar nomes para ajudar na depuração. Atributos personalizados não são suportados em métodos dinâmicos ou seus parâmetros.

Embora os métodos dinâmicos sejam static métodos (Shared métodos no Visual Basic), as regras relaxadas para a vinculação de delegados permitem que um método dinâmico seja vinculado a um objeto, de modo que ele aja como um método de instância quando chamado usando essa instância delegada. Um exemplo que demonstra isso é fornecido para o método de sobrecarga CreateDelegate(Type, Object).

Verificação

A lista a seguir resume as condições sob as quais os métodos dinâmicos podem conter código não verificável. (Por exemplo, um método dinâmico não é verificável se sua InitLocals propriedade estiver definida como false.)

  • Um método dinâmico associado a um componente crítico de segurança também é crítico para a segurança e pode omitir a verificação. Por exemplo, um assembly sem atributos de segurança que é executado como um aplicativo de desktop é tratado como crítico de segurança pelo tempo de execução. Se você associar um método dinâmico com o assembly, o método dinâmico pode conter código não verificável.
  • Se um método dinâmico que contém código não verificável estiver associado a um assembly que tenha transparência de nível 1, o compilador just-in-time (JIT) injetará uma demanda de segurança. A demanda só terá êxito se o método dinâmico for executado por código totalmente confiável. Ver CódigoSecurity-Transparent, Nível 1.
  • Se um método dinâmico que contém código não verificável estiver associado a um assembly que tenha transparência de nível 2 (como mscorlib.dll), ele lançará uma exceção (injetada pelo compilador JIT) em vez de fazer uma demanda de segurança. Ver CódigoSecurity-Transparent, Nível 2.
  • Um método dinâmico hospedado anonimamente que contém código não verificável sempre gera uma exceção. Ele nunca pode pular a verificação, mesmo que seja criado e executado por código totalmente confiável.

A exceção lançada para código não verificável varia dependendo da maneira como o método dinâmico é invocado. Se você invocar um método dinâmico usando um delegado retornado do CreateDelegate método, um VerificationException será lançado. Se invocar o método dinâmico usando o método Invoke, um TargetInvocationException será lançado com um inner VerificationException.