Pregunta

Tengo una función que yo quiero estar seguro es compilado JIT (es decir, justo antes de que se llama). ¿Hay atributos o Valores de ensamblaje que se asegurará de esto? Si no es así, ¿cómo puedo garantizar que una función es compilado JIT?

Gracias!

EDIT:

Quiero hacer esto para evitar que mi solicitud de estrellarse debido a un ensamblaje de referencia que faltan. Si mi función es compilado JIT, puedo envolver la llamada a la función que hace referencia a la asamblea que falta en un bloque try ... catch y con gracia manejar la situación.

Es mi entender que puede haber momentos en los que podrían ser compilados JIT clases enteras (o incluso toda la aplicación) - esto provocaría un error que no podría atrapar.

¿Fue útil?

Solución

Si leo esto correctamente, usted está preocupado acerca de los errores que se producen cuando se compila por primera vez una clase / método. Esto requiere el conocimiento de los límites. Es obtenible con una capa extra.

Si algo es 'malo SuspectType (es decir, una necesidad de ensamblaje no carga), el try / catch en el siguiente no sirve de nada, porque el Jitting del Escenario 1 () sí se producirá un error.

void Scenario1()
{
   try
   {
     var x = new SuspectType();
     ...
   }
   catch (..) { ... }    
}

Podría ser reescrita como

void Scenario1a()
{
   try
   {
      Scenario1b();
   }
   catch (..) { ... }    

}

void Scenario1b()
{
     var x = new SuspectType();
     ...
}

Pero, por el comentario de Jon Skeet, no estoy seguro si esto se cumple para CFX.

Otros consejos

Puede que sea responder a la pregunta equivocada, pero parece que sobre todo quiere ser capaz de interceptar errores de carga de montaje (clases enteras siendo compilados JIT derrotar a los guardias try / catch alrededor de las llamadas, pero eso es un efecto secundario del uso de guardias explícitas en torno llamadas a métodos).

Si se desea capturar los problemas de resolución de montaje, en lugar de especificar un try / catch alrededor de cada llamada sea posible, sólo podía escuchar el evento global AssemblyResolve y responder a los fallos de carga de montaje (estamos hablando de ensamblados .NET aquí , errores de carga de DLL nativa tendrían que ser rastreado con un mecanismo diferente).

static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += OnResolveFailure;
    //...
}

static Assembly OnResolveFailure(object sender, ResolveEventArgs args)
{
    //Do something here...
}

La desventaja de esto es que no se puede hacer mucho, excepto en busca de la Asamblea en otro lugar (o la tala de error). lógica específica y elegante cuando una resolución no no se proporciona con esta forma de detectar errores de carga.

Es esto algo que su aplicación tiene que ser capaz de resolver por sí mismo, o está depurando algún tipo de problema de carga de montaje en este momento?

En este último caso, echar un vistazo al registro de fusión. Esto es registro que se genera por el subsistema de que las sondas para y cargas conjuntos en tiempo de ejecución.

He aquí un artículo: http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx

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