2010-07-25 18 views

Respuesta

3

Si línea IL (con el mismo espíritu de ensamblado en línea con el apoyo de los compiladores de C y C++) es lo que estás buscando, éste puede se logrará mediante la compilación de ida y vuelta posterior a la compilación.

Mike Stall vez ha escrito a tool for that, por lo que yo sé que es bastante maduro:

Aparte de eso, se puede usar F # que soporta Inline IL.

2

La herramienta que necesita se llama Cecil y es parte del proyecto Mono.

Puede obtener más información al respecto aquí: http://www.mono-project.com/Cecil

Tomado de la página web anterior:

Cecil es una librería escrita por JB Evain (http://evain.net/blog/) para generar e inspeccionar los programas y las bibliotecas de la Formato ECMA CIL. Tiene soporte completo para genéricos y admite algunos formatos de símbolos de depuración.

En inglés simple, con Cecil, puede cargar conjuntos gestionados existentes, examinar todos los tipos contenidos, modificarlos sobre la marcha y guardar de nuevo en el disco el conjunto modificado.

2

DynamicMethod es la manera liviana de lograr esto en tiempo de ejecución.

El compilador Microsoft C# no es compatible con la inyección de IL en tiempo de compilación, pero una herramienta de creación de código podría hacerlo como un paso posterior a la compilación.

9

Acabo de posted a utility que permite que los cuerpos completos de la función C# se reemplacen automáticamente con IL en línea, usando un atributo personalizado. Al igual que las utilidades similares, esto funciona mediante el viaje de ida y vuelta de ILDASM/ILASM, que se puede configurar como un paso posterior a la construcción. La herramienta también ajusta el PDB para preservar el paso único y establecer puntos de corte en las instrucciones individuales de IL en el depurador. Es diferente de algunos de los otros forros IL ida y vuelta en el que (sólo) sustitutos de los cuerpos de las funciones enteras, así:

class MyClass 
    { 
     [ILFunc(@" 
    .locals init ([0] int32 i_arg) 
     ldc.i4.3 
     ret 
    ")] 
     int MyFunc(int i_arg) 
     { 
      return 3; 
     } 
    }; 

Para los métodos altamente rendimiento crítico, he intentado usar DynamicMethod a mejorar compiler- generó IL, pero descubrió que el beneficio se pierde debido a la sobrecarga de llamadas del delegado. Inline IL proporciona el beneficio de IL sintonizado a mano sin ese golpe, suponiendo que no hay personalizaciones en tiempo de ejecución para las que realmente se necesita DynamicMethod.

El código fuente completo se encuentra en http://www.glennslayden.com/code/c-sharp/inline-il

+0

¿No ha encontrado ningún atributo ILFunc en su lib. – Denis

+0

@Denis No creo que estuviera proporcionando una lib. Es el código fuente, y hay dos archivos en la página web. El segundo (desplazarse hacia abajo más allá del texto adicional) contiene la definición de ILFunc 'Attribute'. –

+0

¡Seriamente brillante! ¡Gracias! – Thought

Cuestiones relacionadas