He estado viendo algunos de los artículos para la API de generación de perfiles de CLR, y muchos de esos artículos hablan sobre llamar a SetILFunctionBody() para hacer la reescritura de IL actual; sin embargo, ninguno de esos artículos realmente explica exactamente lo que podría usar para reescribir el método real de bytes IL. ¿Hay alguna biblioteca no administrada que me permita escribir IL, o tendría que escribir una?¿Debo escribir mi propia biblioteca de IL no gestionada para volver a escribir IL con la API de creación de perfiles CLR?
Respuesta
Probablemente. Depende.
El Proyecto Mono tiene una biblioteca llamada Cecil, que se puede acceder aquí:
Sin embargo, es de código, que no se puede llamar mientras perfiles logró. Sin embargo, puede tener algunas opciones:
- Use IPC. Puede generar un nuevo proceso, hacer la reescritura usando cecil en ese proceso y luego pasar los bytes a su generador de perfiles usando conductos con nombre.
- Puerto CECIL a C++. El código se distribuye bajo la licencia MIT/X11, por lo que puede hacer esto sin tener que compartir sus cambios.
- Simplemente escriba sus propias cosas desde cero.
# 1 presenta un montón de complejidad adicional. Su generador de perfiles terminaría teniendo más partes móviles de lo que realmente necesitaba. Además, el IPC presenta un montón de gastos generales adicionales.
# 2 llevaría mucho tiempo. Teniendo en cuenta que Cecil todavía está en la versión 0.6, puede que no valga la pena el tiempo para hacerlo, frente a escribir su propia implementación.
# 3 le daría el mayor grado de control, y probablemente sería el más eficiente. Sin embargo, tomaría mucho más esfuerzo que el # 1.
Supongo que quieres hacer esto porque quieres ver lo que está tomando tiempo para que puedas hacerlo más rápido (en lugar de solo obtener información de sincronización). En mi humilde opinión, no necesita la API de creación de perfiles, si puede ejecutar su aplicación en un IDE y pausarla al azar. Here's why.
Los bytes reales tienen que venir de alguna parte y si solo está utilizando la API de generación de perfiles, debe proporcionarlos usted mismo. Este artículo profundiza en cómo 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 el código que necesite en el idioma que prefiera y compilarlo para ILLINOIS. Luego puede extraer los OpCodes en tiempo de diseño y almacenarlos donde pueda alcanzarlos o extraerlos de su IL compilada en tiempo de ejecución y rellenarlos donde los necesite.
AFAIK no hay bibliotecas no administradas para ayudarlo con esto.
Este artículo puede tener lo que busca http://www.codeproject.com/KB/cs/IL_Rewriting.aspx
No es un mal artículo en realidad - que tiene sus limitaciones cuando se trata de la inyección de IL pero sólo uno de los pocos que cubren el tema –
me escribió un sencillo para OpenCover https://github.com/sawilde/opencover la que usted o cualquier otra persona para esa materia puede encontrar útil
- 1. Cómo aprender IL en el CLR
- 2. API para obtener IL de matriz de bytes
- 3. ¿Compilador de IL para .NET?
- 4. genéricos con IL?
- 5. ¿Usar una biblioteca de gráficos/biblioteca de red de nodos o escribir mi propia cuenta?
- 6. ¿Debo escribir mi propio software de foro?
- 7. Convirtiendo código IL a C#
- 8. Generación de IL para métodos recursivos
- 9. Cómo escribir una API de JavaScript?
- 10. Generando IL para métodos anónimos
- 11. IL: ldfld vs ldflda
- 12. Generación de IL para matrices dobles
- 13. ¿Cómo debo volver a escribir la ejecución/confirmación de mi base de datos para que sea susceptible de pruebas unitarias?
- 14. PostSharp - il weaving - thoughts
- 15. ¿Qué es IL Weaving?
- 16. ¿Cómo crear mi propia biblioteca de Java (API)?
- 17. GUI no funciona después de volver a escribir a MVC
- 18. ¿Debo volver a escribir mi aplicación Codeigniter/PHP en Ruby on Rails? ¿Por qué?
- 19. Depurador de código de nivel de IL
- 20. Cómo mapea un puntero de instrucción nativa a IL
- 21. ¿Existe algún comentario en IL?
- 22. Marco de Ruby para escribir una API?
- 23. ¿Debo escribir mi aplicación con Sencha Touch o nativo?
- 24. diferencias IL generado para VB.NET y C#
- 25. ¿Qué tecnología debo usar para escribir mi juego?
- 26. ¿Cómo funciona la directiva .NET IL .maxstack?
- 27. Una herramienta para facilitar la inspección del código IL
- 28. Escribir mi propia interfaz 'todo es un archivo'
- 29. ¿Las instrucciones cortas de IL no son cortas?
- 30. ¿Debug.Assert genera IL en modo de lanzamiento?
Ya uso Cecil, y estoy buscando una alternativa no administrada. – plaureano
Mi punto es que no creo que exista uno. –
Cuando dije "probablemente", respondí la pregunta "¿Necesito escribir la mía ...?". –