Preciso escrever minha própria biblioteca IL não gerenciada para reescrever IL com a API de perfil de CLR?

StackOverflow https://stackoverflow.com/questions/2269844

Pergunta

Eu tenho analisado alguns dos artigos da API de perfil de CLR, e muitos desses artigos falam sobre chamar SetilFunctionBody () para fazer a reescrita real da IL; No entanto, nenhum desses artigos realmente explica exatamente o que você poderia usar para reescrever o método real il Bytes. Existe uma biblioteca não gerenciada por aí que me permite escrever IL, ou eu teria que escrever uma?

Foi útil?

Solução

Provavelmente. Depende.

O projeto Mono tem uma biblioteca chamada Cecil, que você pode acessar aqui:

http://mono-project.com/cecil

No entanto, é um código gerenciado, que você não pode ligar para o perfil. Você pode ter algumas opções:

  1. Use IPC. Você pode gerar um novo processo, fazendo a reescrita usando o CECIL nesse processo e depois passar os bytes de volta ao seu Profiler usando tubos nomeados.
  2. Porta Cecil para C ++. O código é distribuído pela licença MIT / X11, para que você possa fazer isso sem precisar compartilhar suas alterações.
  3. Basta escrever suas próprias coisas do zero.

#1 apresenta um monte de complexidade extra. Seu Profiler acabaria tendo mais partes móveis do que realmente precisava. Além disso, o IPC apresenta um monte de sobrecarga extra.

#2 levaria muito tempo. Dado que o Cecil ainda está apenas na versão 0.6, pode não valer a pena, versus escrever sua própria implementação.

O #3 daria a você o maior grau de controle e provavelmente seria o mais performance. No entanto, seria necessário substancialmente mais esforço do que o número 1.

Outras dicas

Eu escrevi um simples para o Opencrover https://github.com/sawilde/opencover que você ou qualquer outra pessoa, pode achar útil

Este artigo pode ter o que você está procurandohttp://www.codeproject.com/kb/cs/il_rewriting.aspx

Os bytes reais precisam vir de algum lugar e, se você estiver apenas usando a API de perfil, deve fornecer você mesmo. Este artigo é aprofundado sobre como fazê-lo (provavelmente um daqueles que você leu): http://msdn.microsoft.com/en-us/magazine/cc188743.aspx

Uma técnica mais 'comum' é realmente escrever qualquer código que você precisar em qualquer idioma que você preferir e compilá -lo ao IL. Você pode extrair os códigos de operações no tempo de design e armazená-los onde pode alcançá-los ou extraí-los do seu IL compilado no tempo de execução e encher onde precisar.

Afaik Não há bibliotecas não gerenciadas para ajudá -lo com isso.

Suponho que você queira fazer isso porque deseja ver o que está levando tempo para que você possa fazer com que seja mais rápido (em vez de obter várias informações de tempo). IMHO, você não precisa da API de perfil, se você pode executar seu aplicativo sob um IDE e pausar -o aleatoriamente. Aqui está o porquê.

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