Почему был бы блок. GetExecutingAssembly () возвращают пустой указатель?

Я использую 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(); ocassionally возвращает пустой указатель и способ, которым написан код, это не ошибка. Так, мой вопрос состоит в том, почему был бы Assembly.GetExecutingAssembly(); действительно ли возврат быть пустым? Я нашел пару статей, говорящих о том, чтобы там быть ошибками иногда с неуправляемым кодом, но это приложение записано в C# и развернуто с помощью проекта установки.

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

8
задан Nathan 4 March 2010 в 19:24
поделиться

4 ответа

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

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

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

7
ответ дан 5 December 2019 в 08:23
поделиться

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

3
ответ дан 5 December 2019 в 08:23
поделиться

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

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

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

1
ответ дан 5 December 2019 в 08:23
поделиться

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

2
ответ дан 5 December 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: