2010-03-04 13 views
8

Sto utilizzando un file xml come risorsa incorporata per caricare un XDocument. Stiamo utilizzando il seguente codice per ottenere il file appropriato dall'Assemblea:Perché Assembly.GetExecutingAssembly() restituisce null?

XDocument xd = new XDocument(); 
Assembly assembly = null; 

try 
{ 
    assembly = Assembly.GetExecutingAssembly(); 
} 
catch(Exception ex) 
{ 
    //Write exception to server event log 
} 

try 
{ 
    if(assembly != null) 
    { 
     using(StreamReader sr = new 
      StreamReader(assembly.GetManifestResourceStream("assemblyPath"))) 
     { 
      using(XmlTextReader xtr = new XmlTextReader(sr)) 
      { 
       xd = XDocument.Load(xtr); 
      } 
     } 
    } 
} 
catch(Exception ex) 
{ 
    //Write exception to server event log 
} 

Così, quando il codice viene distribuito, di tanto in tanto ci sarà andare alla pagina e nulla sarà caricata dal documento incorporato. Quando controlliamo il registro eventi, non ci sono errori. Se l'utente aggiorna semplicemente la pagina, verrà caricata correttamente. Questo mi ha indotto a pensare che, per qualche ragione, assembly = Assembly.GetExecutingAssembly(); restituisca occasionalmente null, e il modo in cui il codice è scritto non sia un errore. Quindi, la mia domanda è: perché Assembly.GetExecutingAssembly(); restituisce nulla? Ho trovato un paio di articoli che parlano di errori a volte con codice non gestito, ma questa applicazione è scritta in C# e distribuita tramite il progetto di installazione.

Il codice è stato originariamente scritto senza codice di errore. È stato aggiunto per impedire agli utenti di ottenere schermate di errore. Le eccezioni vengono scritte nel registro eventi del server.

+0

Una domanda molto stupida (come non posso di imaging GetExecutingAssembly fallendo nel codice gestito puro): fanno errori accadere (in qualsiasi altro pezzo di codice) che causano una voce da scrivere nel registro eventi? Sto chiedendo solo di essere sicuro che il codice di scrittura del registro eventi sia corretto e che si possano escludere eccezioni – Timores

+0

Spiacente, dovrei averlo specificato un po 'di più. progetto di utilità per scrivere l'eccezione nel log degli eventi.Il codice per farlo è utilizzato in tutta l'applicazione e funziona.Inoltre, il codice precedente è in un metodo che viene chiamato durante l'intializzazione della pagina – Nathan

+0

Quindi, dopo aver visto che tutti sembrano d'accordo che GetExecutingAssemb ly() non restituisce null, sono tornato indietro e ho esaminato il resto del metodo. Dopo alcune ricerche ho trovato questo articolo su MSDN: http://msdn.microsoft.com/en-us/library/xc4235zt(VS.85).aspx. In esso è detto GetManifestResourceStream() può restituire null se la risorsa non viene trovata o è inaccessibile. Restituire null al costrutto using() non causerebbe un'eccezione. Quindi lo distribuiremo per vedere se è il colpevole. – Nathan

risposta

3

Sei sul crinale con la pala sbagliata, GetExecutingAssembly() non restituisce mai nulla. Prova a te stesso rimuovendo tutto il codice di errore, compreso il controllo nulla. Ottenere errori occasionali è solitamente un problema di threading.

1

Di fronte a una situazione come questa, provo a dimostrare realmente che il valore restituito era nullo. Prova questo:

try 
{ 
    assembly = Assembly.GetExecutingAssembly(); 
    Log.Write("Executing assembly is null: " + (assembly == null)) 
} 
catch(Exception ex) 
{ 
    //Write exception to server event log 
} 

Ho il sospetto che sarà sempre scrivere "false", e qualcos'altro è in realtà il problema - forse qualcosa che non hai incluso nel snippet di codice.

7

Questo è un esempio perfetto del motivo per cui è un'idea quasi universalmente sbagliata mangiare eccezioni, in particolare il livello superiore System.Exception. Il problema potrebbe essere ovunque; più probabile che no, il vero problema è nel tuo codice di registrazione.

Estrarre quelle vuote catch blocchi (o rigenerare loro interno con throw;) e vediamo dove l'eccezione è veramente verificano. E una volta trovato il vero problema e riscritto il codice, riscrivilo per rilevare solo le eccezioni che in realtà è sapere come gestire.

GetExecutingAssembly non restituisce null, punto.

5

andare alle proprietà del file il cui percorso è menzionato e modificare il BuildAction dal contenuto che è quella predefinita alla EmbeddedResource. Ricompila e dovrebbe funzionare.

1

che può restituire null se si stanno lanciando il codice da un'applicazione non gestita (ad esempio il test corridore NUnit): Prova il seguente utilizzando la console:

[Test] 
public void att() 
{ 
    Assert.NotNull(Assembly.GetExecutingAssembly()); 
} 

Visto che avete codificato esso incorporato, ho Supponiamo che tu stia utilizzando una sorta di bootloader o un interprete per eseguire la tua app .Net? Questo sarebbe probabilmente non gestito (cioè non .Net interpretato) e quindi restituirebbe null.

consultare la documentazione, sezione "Osservazioni: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx

+0

Non che qualcuno lo guardi ora: / – chrisb

Problemi correlati