2010-03-04 13 views
8

Estoy usando un archivo xml como recurso incrustado para cargar un XDocument. Estamos utilizando el siguiente código para obtener el archivo correspondiente de la Asamblea:¿Por qué Assembly.GetExecutingAssembly() devolverá nulo?

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 
} 

Así que cuando se despliega el código, que de vez en cuando ir a la página y nada será cargada desde el documento incrustado. Cuando verificamos el registro de eventos, no hay ningún error. Si el usuario simplemente actualiza la página, se cargará bien. Esto me ha llevado a pensar que, por alguna razón, assembly = Assembly.GetExecutingAssembly(); ocasionalmente devuelve nulo, y la forma en que se escribe el código no es un error. Entonces, mi pregunta es ¿por qué Assembly.GetExecutingAssembly(); devolverá nulo? Encontré un par de artículos sobre errores a veces con código no administrado, pero esta aplicación está escrita en C# y se implementó a través de un proyecto de configuración.

El código se escribió originalmente sin código de anulación de error. Se agregó para evitar que los usuarios obtengan pantallas de error. Las excepciones se escriben en el registro de eventos del servidor.

+0

Una pregunta muy estúpida (ya que no puedo obtener imágenes GetExecutingAssembly no en código administrado puro): qué ocurren errores (en cualquier otra pieza de código) que causan una entrada para escribir en el registro de eventos? Solo pido para asegurarme de que el código de escritura del registro de eventos sea correcto y que las excepciones se puedan descartar. – Timores

+0

Lo siento, debería haberlo especificado un poco más. Las capturas están llamando a un método en una proyecto de utilidad para escribir la excepción en el registro de eventos. El código para hacerlo se utiliza en toda la aplicación y funciona. Además, el código anterior está en un método que se llama durante la inicialización de la página. – Nathan

+0

Entonces, después de ver que todo el mundo parece acuerda que GetExecutingAssemb ly() no devolverá nulo, volví y miré el resto del método. Después de buscar, encontré este artículo en MSDN: http://msdn.microsoft.com/en-us/library/xc4235zt(VS.85).aspx. En él se dice que GetManifestResourceStream() puede devolver nulo si el recurso no se encuentra o no es accesible. Devolver null al constructo using() no causaría una excepción. Así que vamos a implementar esto y ver si es el culpable. – Nathan

Respuesta

3

Estás en el arroyo con la pala incorrecta, GetExecutingAssembly() nunca devuelve nulo. Pruébelo usted mismo al eliminar todo el código de prevención de errores, incluida la verificación nula. Conseguir fallas ocasionales suele ser un problema de enhebrado.

1

Cuando me enfrento a una situación como esta trato de demostrar realmente que el valor devuelto fue nulo. Prueba esto:

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

sospecho que siempre se escribirá "falsa", y algo más es en realidad el problema - tal vez algo que usted no incluyó en el fragmento de código.

7

Este es un ejemplo perfecto de por qué es una idea casi universalmente mala comer excepciones, especialmente el nivel superior System.Exception. El problema podría estar en cualquier lado; más probable que no, el verdadero problema está en su código de registro.

Saque esos vacíos catch bloques (o volver a lanzar dentro de ellos con throw;) y ve en la excepción es realmente ocurriendo. Y una vez que encuentre el problema real y reescriba su código, vuelva a escribirlo para captar solo las excepciones que realmente sabe cómo manejar.

GetExecutingAssembly no devolverá null, punto.

5

ir a las propiedades del archivo cuya ruta se menciona y cambiar el BuildAction de contenido que es de por defecto para EmbeddedResource. Recompile y debería funcionar.

1

que puede devolver null si usted está lanzando su código no administrado desde una aplicación (por ejemplo, el corredor NUnit Test): intente lo siguiente utilizando la consola:

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

Viendo como ha etiquetado se incrusta, me ¿Supongo que está utilizando algún tipo de gestor de arranque o intérprete para ejecutar su aplicación .Net? Eso probablemente no se gestionaría (es decir, no se interpretaría en .Net) y, por lo tanto, devolvería nulo.

Véase la documentación, apartado de "Observaciones: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx

+0

No es que nadie vaya a verlo ahora: / – chrisb

Cuestiones relacionadas