Domanda

Ho una funzione che voglio essere sicuro è compilato JIT (vale a dire a destra prima si chiama). Ci sono gli attributi o le impostazioni di montaggio che garantirà questo? Se no, allora come posso garantire che una funzione viene compilata JIT?

Grazie!

Modifica

Voglio fare questo per evitare che la mia applicazione da schiantarsi a causa di un assembly di riferimento mancante. Se la mia funzione è compilato JIT, posso avvolgere la chiamata di funzione che fa riferimento il gruppo mancante in un blocco try ... catch e gestire correttamente la situazione.

E 'la mia comprensione che ci potrebbero essere momenti in cui intere classi (o anche l'intera applicazione) potrebbero essere Jitted - questo potrebbe causare un errore che non potevo prendere.

È stato utile?

Soluzione

Se leggo correttamente questo, siete preoccupati per errori che si verificano quando una classe / metodo viene prima compilato. Ciò richiede consapevolezza dei limiti. E 'ottenibile con uno strato supplementare.

Se qualcosa è 'sbagliato con SuspectType (vale a dire un assemblaggio richiesto non carico), il try / catch nel seguente è di alcuna utilità perché il Jitting di Scenario1 () si fallirà.

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

Potrebbe essere riscritta come

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

}

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

Ma, per il commento di Jon Skeet, non sono sicuro se questo vale per CFX.

Altri suggerimenti

I può essere rispondendo alla domanda sbagliata, ma sembra che si vuole soprattutto essere in grado di intercettare errori di caricamento di montaggio (intere classi essendo JITted sconfiggere le guardie try / catch intorno alle chiamate, ma questo è un effetto collaterale di utilizzare guardie espliciti intorno chiamate di metodo).

Se si desidera catturare guai risoluzione dell'Assemblea, invece di specificare un try / catch intorno ad ogni eventuale chiamata, si può solo ascoltare l'evento AssemblyResolve globale e rispondere ai fallimenti gruppo di carico (stiamo parlando di assembly .NET qui , errori di caricamento della DLL nativa dovrebbero essere monitorati con un meccanismo diverso).

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

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

L'aspetto negativo di questo è che non si può fare molto, tranne che alla ricerca per l'assemblaggio da qualche altra parte (o registrazione di errore). logica specifica e grazioso quando una risoluzione non non viene fornito con questo modo di catturare errori di caricamento.

E 'questo qualcosa che la vostra applicazione ha bisogno di essere in grado di risolvere su di essa la propria, o stai debug qualche tipo di problema di carico di montaggio in questo momento?

In quest'ultimo caso, uno sguardo al registro di fusione. Si tratta di registro generato dal sottosistema che sonda e carichi assemblee in fase di esecuzione.

Ecco un articolo: http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top