Pregunta

He estado buscando en algunos de los artículos de la API de perfiles de CLR, y muchos de esos artículos hablar de llamar SetILFunctionBody () para hacer la IL real de volver a escribir; Sin embargo, ninguno de esos artículos realmente explicar exactamente lo que usted podría utilizar para reescribir el método bytes reales IL. ¿Hay una biblioteca no administrado por ahí que me permite escribir IL, o tendría que escribir uno mismo?

¿Fue útil?

Solución

Probablemente. Depende.

El proyecto Mono tiene una biblioteca llamada Cecil, que se puede acceder aquí:

http://mono-project.com/Cecil

Sin embargo código es administrado, lo que no se puede llamar mientras perfiles. Es posible que una tiene algunas opciones sin embargo:

  1. Utilice IPC. Se podría generar un nuevo proceso, haciendo uso de la reescritura Cecil en ese proceso y luego pasar los bytes de nuevo a su generador de perfiles utilizando canalizaciones con nombre.
  2. Puerto CECIL a C ++. del código distribuido bajo la licencia MIT / X11, por lo que podría hacer esto sin tener que compartir sus cambios.
  3. Sólo tiene que escribir su propia materia a partir de cero.

# 1 introduce un montón de complejidad adicional. Su perfilador podría llegar a tener más piezas móviles de lo que realmente se necesita. Asimismo, el IPC presenta un montón de sobrecarga adicional.

# 2 tomaría mucho tiempo. Teniendo en cuenta que Cecil todavía se encuentra en la versión 0.6, que podría no ser vale la pena el tiempo para hacerlo, frente a escribir su propia aplicación.

# 3 le daría el mayor grado de control, y sería probablemente el mas potente. Sin embargo se tardaría mucho más esfuerzo que el # 1 lo haría.

Otros consejos

escribí un sencillo para OpenCover https://github.com/sawilde/opencover que se o cualquier otra persona para esa materia puede encontrar útil

Este artículo puede tener lo que busca http://www.codeproject.com/KB/cs/IL_Rewriting.aspx

Los bytes reales tiene que venir de alguna parte, y si usted está usando la API de perfiles, entonces debe proporcionarles a sí mismo. En este artículo se va a fondo sobre la forma de hacerlo (probablemente uno de los que ha leído): http://msdn.microsoft.com/en-us/magazine/cc188743.aspx

Una técnica más 'común' es escribir realmente lo necesita código en cualquier idioma que prefiera y luego compilarlo a IL. A continuación, puede extraer los OpCodes en tiempo de diseño y almacenarlos donde se puede llegar a ellos o extraerlos de su compilado IL en tiempo de ejecución y rellenarlo donde lo necesite.

Que yo sepa no hay bibliotecas no administrados para ayudarle con esto.

Asumo que quieres hacer esto porque usted quiere ver lo que está tomando tiempo para que pueda hacer que vaya más rápido (en lugar de sólo conseguir varias informaciones de sincronización). En mi humilde opinión, no se necesita la API de perfiles, si se puede ejecutar su aplicación en virtud de un IDE y pausa al azar. He aquí por qué.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top