una toyota tiempo tesis practicos libro justo just empresa ejemplos como aplicacion aplica c# jit inlining

c# - toyota - Prevención de JIT en línea en un método



justo a tiempo toyota (2)

Podría usar MethodImplAttribute y especificar MethodImplOptions.NoInlining .

[MethodImpl(MethodImplOptions.NoInlining)] void YourMethod() { // do something }

Tenga en cuenta que esto todavía no garantiza que pueda obtener el método de llamada real como se ve en el código fuente. Su método no estará en línea, pero la persona que llama a su método podría estar en línea en su propia persona que llama, etc.

Tengo una especie de situación única. He estado trabajando en una biblioteca de código abierto para enviar correos electrónicos. En esta biblioteca, necesito una forma confiable de obtener el método de llamada. He hecho esto con un StackTrace analizando los objetos StackFrame dentro de él. Esto funciona sin problemas en un proyecto en modo de depuración donde las optimizaciones están desactivadas.

El problema ocurre cuando cambio al modo de liberación donde están activadas las optimizaciones. La traza de pila se ve así:

> FindActionName at offset 66 in file:line:column <filename unknown>:0:0 > Email at offset 296 in file:line:column <filename unknown>:0:0 > CallingEmailFromRealControllerShouldFindMailersActionName at offset 184 in file:line:column <filename unknown>:0:0 > _InvokeMethodFast at offset 0 in file:line:column <filename unknown>:0:0 > InvokeMethodFast at offset 152 in file:line:column <filename unknown>:0:0 ...

Esto se toma de una prueba de unidad que falla. En la línea 3 de este rastreo, debería ver un método llamado TestEmail que se define en otra parte, pero creo que el JITter lo está incorporando. He leído que se puede evitar la inclusión al hacer que un método sea virtual, pero esto no funciona. ¿Alguien sabe de un método confiable para prevenir el ingreso de métodos para que su método aparezca en un seguimiento de pila?


Podría usar parámetros adicionales marcados con System.Runtime.CompilerServices.CallerMemberNameAttribute y sus hermanos CallerFilePath y CallerLineNumber . Si lo comprendo correctamente, esto debería darle el nombre del método correcto, sin importar lo que esté en la línea y lo que no. Sin embargo, solo obtendrá el nombre del método, no veo nada para obtener el nombre / conjunto de la clase, etc.

No hace falta decirlo, pero solo para estar seguro ... algo como esto no debe usarse fuera del registro / diagnóstico.

Las formas apropiadas de hacer esto probablemente serían:

  • Pasar la información requerida como parámetro.
  • Almacene temporalmente la información requerida en Thread.ExecutionContext mientras llama a la función

Me doy cuenta de que esto probablemente no será de ninguna ayuda para Scott después de todo este tiempo, pero tal vez alguien más pueda beneficiarse de ello.