System.Reflection.Emit.DynamicMethod classe
Este artigo fornece observações complementares à documentação de referência para essa API.
Você pode usar a DynamicMethod classe para gerar e executar um método em tempo de execução, sem ter que 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 objeto é recuperado DynamicMethod . 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 for hospedado anonimamente, ele estará localizado em um assembly fornecido pelo sistema e, portanto, será 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 capacidade restrita de ignorar as verificações de visibilidade do compilador JIT, se ele tiver sido concedido ReflectionPermission com o ReflectionPermissionFlag.RestrictedMemberAccess sinalizador. 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 ou um subconjunto do 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 Demonstra 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 especificado, o método dinâmico será efetivamente global para esse módulo. Ele pode acessar todos os tipos no módulo e todos os
internal
membros (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 uma demanda com ReflectionPermission o RestrictedMemberAccess sinalizador possa ser satisfeita pela pilha de chamadas que inclui seu código. Se o sinalizador for incluído na concessão, o ReflectionPermissionFlag.MemberAccess método dinâmico poderá ignorar as verificações de visibilidade do compilador JIT e acessar os dados privados de todos os tipos declarados no módulo ou em qualquer outro módulo em 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 assembly. 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 ReflectionPermission com o RestrictedMemberAccess sinalizador é concedido.
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 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 assembleia. | Todos os membros de todos os tipos em qualquer assembleia. |
Um método dinâmico associado a um módulo tem as permissões desse módulo. Um método dinâmico 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. Não há suporte para atributos personalizados 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 associação delegada 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 a sobrecarga do CreateDelegate(Type, Object) método.
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 será verificável se sua InitLocals propriedade estiver definida como false
.)
- Um método dinâmico associado a um assembly crítico de segurança também é crítico de segurança e pode ignorar a verificação. Por exemplo, um assembly sem atributos de segurança que é executado como um aplicativo de área de trabalho é tratado como crítico de segurança pelo tempo de execução. Se você associar um método dinâmico ao assembly, o método dinâmico poderá 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 será bem-sucedida somente se o método dinâmico for executado por código totalmente confiável. Consulte Código Transparente de Segurança, 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. Consulte Código Transparente de Segurança, Nível 2.
- Um método dinâmico hospedado anonimamente que contém código não verificável sempre lança uma exceção. Ele nunca pode ignorar 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 é chamado. Se você invocar um método dinâmico usando um delegado retornado do CreateDelegate método, um VerificationException será lançado. Se você invocar o método dinâmico usando o Invoke método, um será lançado com um TargetInvocationExceptionVerificationExceptionarquivo .