2010-02-16 5 views
7

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

3

Probablemente. Depende.

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

http://mono-project.com/Cecil

Sin embargo, es de código, que no se puede llamar mientras perfiles logró. Sin embargo, puede tener algunas opciones:

  1. 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.
  2. 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.
  3. 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.

+0

Ya uso Cecil, y estoy buscando una alternativa no administrada. – plaureano

+0

Mi punto es que no creo que exista uno. –

+0

Cuando dije "probablemente", respondí la pregunta "¿Necesito escribir la mía ...?". –

-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.

0

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.

Cuestiones relacionadas