Почему Assembly.GetExecutingAssembly () возвращает ноль? - PullRequest
8 голосов
/ 04 марта 2010

Я использую XML-файл в качестве встроенного ресурса для загрузки XDocument. Мы используем следующий код для получения соответствующего файла из сборки:

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
}

Таким образом, когда код развернут, мы время от времени переходим на страницу, и из встроенного документа ничего не загружается. Когда мы проверяем журнал событий, ошибок нет. Если пользователь просто обновит страницу, он загрузится нормально. Это привело меня к мысли, что по какой-то причине assembly = Assembly.GetExecutingAssembly(); иногда возвращает ноль, и способ написания кода не является ошибкой. Итак, мой вопрос: почему бы Assembly.GetExecutingAssembly(); возвращать ноль? Я нашел несколько статей, в которых говорилось о том, что иногда возникают ошибки с неуправляемым кодом, но это приложение написано на C # и развернуто с помощью проекта установки.

Код был изначально написан без кода избежания ошибок. Он был добавлен, чтобы пользователи не получали экран ошибок. Исключения записываются в журнал событий сервера.

Ответы [ 6 ]

7 голосов
/ 04 марта 2010

Это прекрасный пример того, почему почти универсально плохая идея есть исключения, особенно верхнего уровня System.Exception. Проблема может быть где угодно; скорее всего, настоящая проблема в вашем коде регистрации.

Выньте эти пустые catch блоки (или отбросьте их внутри с помощью throw;) и посмотрите, где происходит исключение на самом деле . И как только вы обнаружите реальную проблему и переписаете свой код, перепишите его, чтобы перехватывать только те исключения, которые вы действительно знаете, как обрабатывать .

GetExecutingAssembly не вернется null, точка.

5 голосов
/ 16 ноября 2011

перейдите к свойствам файла, путь которого указан, и измените buildAction с содержимого, которое по умолчанию, на EmbeddedResource. Перекомпилируй и все должно заработать.

3 голосов
/ 04 марта 2010

Вы находитесь в ручье с неправильным веслом, GetExecutingAssembly () никогда не возвращает ноль. Убедитесь в этом сами, удалив весь код избежания ошибок, включая проверку нуля. Получение случайного сбоя обычно является проблемой с многопоточностью.

2 голосов
/ 13 марта 2014

Может возвращать значение NULL, если вы запускаете свой код из неуправляемого приложения (например, NUnit Test Runner): Попробуйте следующее с помощью консоли:

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

Видя, как вы пометили его как встроенный, я предполагаю, что вы используете какой-то загрузчик или интерпретатор для запуска приложения .Net? Это, вероятно, будет неуправляемым (т.е. не интерпретируемым .Net) и, следовательно, вернет ноль.

См. Документацию, раздел "Примечания: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx

2 голосов
/ 09 марта 2010

Это может быть одной из причин - http://winterdom.com/2003/04/assemblygetexecutingassembly

1 голос
/ 04 марта 2010

Когда я сталкиваюсь с такой ситуацией, я пытаюсь доказать, что возвращаемое значение было нулевым. Попробуйте это:

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

Я подозреваю, что это всегда будет писать "ложь", и проблема действительно в чем-то другом - возможно, в том, что вы не включили в свой фрагмент кода.

...