Compartilhar via


reflexão Emit dinâmico método Scenarios

Métodos dinâmicos criados usando o DynamicMethod classe (novo no .NET estrutura versão 2.0) oferecem recursos avançados para emitindo métodos estático em time de execução. Métodos dinâmicos ampliar a funcionalidade dos tipos no System.Reflection.Emit 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 uma melhor utilização do recurso porque a memória usada pelo corpos de método pode ser recuperada quando o método é não são mais necessários.

  • Devido a permissões de segurança suficientes, eles fornecem capacidade de associar código com um tipo ou assembly existente e esse código pode ter a mesma visibilidade sistema autônomo tipos internos ou particular membros.

  • Devido a permissões de segurança suficientes, elas permitir código ignorar just-in-time (JIT) verificações de visibilidade e acesso a particular e dados de objetos protegidos.

Métodos dinâmicos podem usar um ILGenerator objeto emitir Microsoft intermediate linguagem (MSIL). Além disso, métodos dinâmicos podem usar um DynamicILInfo objeto para trabalhar com símbolos de metadados e escopos que permite que clientes sofisticados executar seu próprios geração MSIL.

Métodos dinâmicos são úteis em situações em que geração de código em time de execução é necessária para o desempenho.Exemplos discutidos nesta seção incluem serialização, mapeamentos entre objetos e bancos de dados relacionais, expressões regulares, avaliação parcial e compiladores idiomas 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 atrasado vinculados chama

Métodos dinâmicos são úteis para escritores de compilador quando o tipo de um objeto não é conhecido em time de compilar.Chamadas para os membros do objeto devem ser resolvidas em time de execução, com freqüência com a sobrecarga adicional de manipulação de listas de argumentos.O seguinte código do Visual Basic 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 pesquisar SomeMethod, Preparar sistema autônomo argumentos sistema autônomo uma matriz de objetos e chamar o método. Executando essas chamadas com reflexão, usando o InvokeMember método, não fornece um mercadoria desempenho. Desempenho pode ser melhorado com o uso de membros do System.Reflection.Emit espaço para nome 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 uma estratégia de implementação mais eficiente em casos em que a assinatura do método dinâmico corresponde a um tipo delegado existente, porque não é necessário para criar um assembly dinâmico, módulo ou tipo.Essa abordagem muito melhor do que usando o executaInvokeMember método. Ele não executa, bem sistema autônomo uma telefonar 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 recuperados quando não são mais necessários.

Série

Métodos dinâmicos podem eliminar a necessidade de gravar código personalizado de serialização e desserialização.Você pode marcar um tipo serializável de acordo com regras simples e, em seguida, use um mecanismo de serialização para examinar sistema autônomo metadados para o tipo e gerar um serializador adequado e deserializer conforme necessário e execute 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 não criados pelo criador do mecanismo.

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

Avaliação parcial

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

Usando esta técnica, geralmente é possível transformar um algoritmo de uso geral de baixo desempenho em um algoritmo especializado de alto desempenho.Alguns exemplos são:

  • Compilando um Regex objeto para gerar um programa que é especializado para corresponder a um determinado padrão.

  • Compilar 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 parcial avaliação Gerando métodos especializados em time de execução.Além de melhorias de desempenho, métodos dinâmicos permitir que a recuperação de corpos de método MSIL e o código de computador relacionado produzido pelo compilador JIT.Isso pode ser fundamental em programas em execução demorada.

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

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

Muitos aplicativos ou plataformas tem mecanismos de extensibilidade dar aos usuários a capacidade de escrever e executar código personalizado, enquanto o aplicativo é executado, freqüentemente por meio do uso de funções predefinidas.Usando métodos dinâmicos para gerar esse código, o designer do aplicativo ou plataforma pode reduzir o número de funções necessários (e, portanto, o rastro de memória) e fornecem mais flexibilidade para o usuário sem prejudicar o desempenho.

Consulte também

Tarefas

Como: Definir e executar métodos dinâmicos

Conceitos

reflexão Emit cenários de aplicativo

Referência

DynamicMethod

Outros recursos

Emitindo Métodos Dinâmicos e Assemblies