Pergunta

me deparei com uma breve discussão recentemente em outro site sobre C # compilação de tempo de execução recentemente durante a pesquisa para outra coisa e pensei que a ideia era interessante. Você já usou isso? Eu estou tentando determinar como / quando se pode usar este e qual o problema que resolve. Eu estaria muito interessado em saber como você já usou ou em que contexto, faz sentido.

Muito obrigado.

Foi útil?

Solução

Normalmente, eu vejo este utilizado nos casos em que você está usando atualmente Reflexão e necessidade de otimizar o desempenho.

Por exemplo, em vez de usar a reflexão para chamada de método X, você gera um método dinâmico em tempo de execução para fazer isso por você.

Outras dicas

Você pode usar isso para adicionar suporte a scripts para sua aplicação. Para exemplos olhar aqui ou aqui .

É muito facilmente possível publicar partes de seu quadro objeto interno para a parte scripting, então você poderia com facilidade acrescentar algo em relação ao seu aplicativo que tem o mesmo efeito como por exemplo VBA para o Office.

Eu vi isso (compilação de tempo de execução / uso de classes System.Reflection.Emit) na geração de proxies dinâmicos ( Código projeto de exemplo ) ou outros meios de otimizar chamadas reflexão (tempo-wise).

Pelo menos um caso, você pode usá-lo é quando a geração de código dinâmico. Por exemplo, o quadro está usando isso internamente para gerar serializers XML na mosca. Depois de olhar para uma classe em tempo de execução, ele pode gerar o código para serializar / desserializar a classe. Em seguida, ele compila que o código e os usuários-lo conforme necessário. Da mesma forma você pode gerar código para lidar com tabelas DB arbitrárias etc. e, em seguida, compilar e carregar o gerado montagem.

Bem, todo o código C # é em tempo de execução compilado, já que é um compilador JIT (just-in-time). Eu suponho que você está se referindo a Reflection.Emit criar classes etc on the fly. Aqui está um exemplo que eu tenho visto recentemente na biblioteca Xml-Rpc.Net.

I criar uma interface C # que tem a mesma assinatura que chamadas de método de um serviço XML-RPC, e.

IMyProxy : IXmlRpcProxy
{
    [XmlRpcMethod]
    int Add(int a, int b);
}

Em seguida, no meu código eu chamada algo como

IMyProxy proxy = (IMyProxy)XmlRcpFactory.Create(typeof(IMyProxy));

Isto usa run-time geração de código para criar um proxy totalmente funcional para mim, para que eu possa usá-lo como este:

int result = proxy.Add(1, 2);

Isso, então, lida com a chamada XML-RPC para mim. Muito legal.

Eu usei serviços compilador de tempo de execução do .NET na minha tese de diploma. Basicamente, foi a criação de cerca visualmente algum componente gráfica para uma visualização do processo, que é gerado como código C #, compilado em um conjunto e, em seguida, pode ser utilizado no sistema alvo sem ser interpretado, para torná-lo mais rápido e mais compacto. E, como um bônus, as imagens geradas podem ser embalados no mesmo assembly como recursos.

O outro uso do que estava em Java. Eu tinha um aplicativo que tinha que traçar uma função potencialmente caro usando algum algoritmo numérico (estava de volta na universidade), o usuário pode entrar. Eu coloquei a função entrou em uma classe, compilados e carregá-la e foi então disponível para a execução relativamente rápido.

Assim, estas são as minhas duas experiências em que a geração do código de tempo de execução era uma coisa boa.

algo que eu usei para foi para permitir C # e código VB para bu corrida pela ad-hoc usuário. Eles poderia digitar uma linha de código (ou de um par de linhas) e que iria ser compilado, carregado para um domínio de aplicação, e executado, e, em seguida, descarregado. Este provavelmente não é o melhor exemplo de seu uso, mas um exemplo de que nada-a-menos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top