Partilhar via


Cenários de método dinâmico de emissão de reflexão

Métodos dinâmicos criados usando o classe deDynamicMethod (novo na.NET Framework versão 2.0) oferecem recursos avançados para emitir os métodos estáticos em tempo de execução. Métodos dinâmicos expandir a funcionalidade dos tipos na System.Reflection.Emit o namespace de várias maneiras:

  • Eles têm menos sobrecarga, porque não há necessidade de gerar assemblies dinâmicos, módulos e tipos para conter os métodos.

  • Em aplicativos de execução demorada, eles fornecem melhor utilização de recursos, porque a memória usada pelo corpos de método pode ser recuperada quando o método não é mais necessária.

  • Recebe permissões de segurança suficientes, eles fornecem a capacidade de associar código um assembly existente ou um tipo e que o código pode ter a mesma visibilidade como tipos internos ou membros particulares.

  • Devido a permissões de segurança suficientes, eles permitem o código para ignorar as verificações de visibilidade do just-in-time (JIT) e acessar os dados particulares e protegidos de objetos.

Métodos dinâmicos podem usar um ILGenerator objeto emitir Microsoft intermediate language (MSIL). Além disso, os métodos dinâmicos podem usar um DynamicILInfo o objeto para trabalhar com tokens de metadados e escopos que permitem que os clientes sofisticados executar seus próprios geração MSIL.

Métodos dinâmicos são úteis para cenários em que a geração de código de tempo de execução é necessária para o desempenho. São discutidos nesta seção exemplos serialização, mapeamentos entre objetos e bancos de dados relacionais, expressões regulares, avaliação parcial e compiladores de linguagens que exigem tempos de execução.

Para obter um exemplo simples de geração de método dinâmico, consulte Como: Definir e executar métodos dinâmicos.

Idiomas que suporte tardia chama

Métodos dinâmicos são úteis para escritores de compiladores, quando o tipo de um objeto não é conhecido em tempo de compilação. Chamadas para os membros do objeto devem ser resolvidas em tempo de execução, com freqüência com a sobrecarga adicional de manipulação de listas de argumentos. O Visual Basic código a seguir fornece um exemplo disso.

Sub Example(ByVal obj as Object)
    ' ...
    obj.SomeMethod(x, y, z)
    ' ...
End Sub

O compilador deve gerar o código para consultar SomeMethod, preparar os argumentos como uma matriz de objetos e chamar o método. A execução de tais chamadas com reflexão, usando o InvokeMember método, não fornece um bom desempenho. Desempenho pode ser melhorado usando os membros da System.Reflection.Emit namespace para criar um assembly dinâmico, módulo, tipo e método, mas isso pode resultar em um conjunto de trabalho maior e maior complexidade de código. Métodos dinâmicos permitem que uma estratégia de implementação mais eficiente nos casos em que a assinatura do método dinâmico corresponde a um tipo de delegado existente, porque não há necessidade de criar um assembly dinâmico, um módulo ou um tipo. Essa abordagem executa muito melhor do que usar o InvokeMember método. Ele não executa, bem como uma chamada virtual, mas requer um conjunto de trabalho muito menor porque não há novos tipos são criados. Além disso, a MSIL gerada e o código nativo associado podem ser recuperadas quando não mais necessários.

Série

Métodos dinâmicos podem eliminar a necessidade de escrever personalizado de serialização e desserialização de código. Você pode marcar um tipo serializável, de acordo com regras simples e, em seguida, usar um mecanismo de serialização para examinar os metadados para o tipo, gerar um serializador adequado e deserializer, conforme necessário e executar o código gerado em instâncias do tipo.

Devido a permissões de segurança suficientes, um mecanismo de serialização implementado usando métodos dinâmicos pode acessar dados particulares e protegidos para habilitar a serialização de objetos que não são criados pelo criador do mecanismo.

Métodos gerados podem ser armazenado em cache se usado com freqüência, ou simplesmente pode ser liberados.

Avaliação parcial

Avaliação parcial, também conhecido como a especialização do programa, é uma técnica para otimizar os algoritmos onde uma ou mais das variáveis de entrada variam mais lentamente do que as outras entradas. Avaliação parcial gera chamadas de método especializado que tratam os valores das entradas variados lentamente, como se fossem constantes, permitindo que a otimizações adicionais a serem aplicados ao algoritmo como um todo.

Usando esta técnica, geralmente é possível transformar um algoritmo de uso geral de baixo desempenho em um algoritmo de alto desempenho especializado. A seguir está alguns exemplos:

  • Compilando um Regex o objeto para gerar um programa que é especializado para correspondência com um padrão específico.

  • Compilando um mecanismo de serialização orientada por metadados em um programa que é especializado para serializar e desserializar um tipo específico ou um conjunto de tipos.

  • Compilando um esquema XML para gerar um programa que é especializado para validar um esquema específico.

  • Compilar uma transformação XSLT em um programa que é especializado para transformar um documento XML de uma maneira específica.

  • Compilando um programa genérico de criptografia que criptografa dados usando qualquer chave especificada em um programa que é otimizado para uma determinada chave.

Métodos dinâmicos podem ser usados para implementar a avaliação parcial Gerando métodos especializados em tempo de execução. Além dos aprimoramentos de desempenho, métodos dinâmicos permitir que a recuperação de corpos de método MSIL e o código de máquina relacionado produzido pelo compilador JIT. Isso pode ser fundamental em programas de execução demorada.

Para obter uma descrição de alguns desses cenários mais detalhes, consulte Cenários de aplicativo de emissão de reflexão.

Gerando o código de usuário personalizado em tempo de execução

Muitos aplicativos ou plataformas têm mecanismos de extensibilidade que permitem aos usuários a capacidade de gravar e executar código personalizado, enquanto o aplicativo é executado, freqüentemente através do uso de funções predefinidas. Usando métodos dinâmicos para gerar esse código, o designer de aplicativo ou plataforma pode reduzir o número de funções necessárias (e, portanto, o espaço de memória) e fornecem maior flexibilidade para o usuário sem sacrificar o desempenho.

Consulte também

Tarefas

Como: Definir e executar métodos dinâmicos

Referência

DynamicMethod

Conceitos

Cenários de aplicativo de emissão de reflexão

Outros recursos

Emitindo Métodos Dinâmicos e Assemblies