NullReferenceException только при открытии изображений из базы данных

У меня есть таблица в моей базе данных, в которой хранятся все типы файлов.

Имена файлов отображаются в ListView, и когда пользователь щелкает одно из них, оно открывается зарегистрированным приложением на основе расширения файла.

Это код:

if (listViewArchivos.HasItems)
{
    dynamic result = listViewArchivos.SelectedItem;
    var nombre = Path.GetTempPath() + admin.buscarNombreArchivo((int)result.Id);
    var bytes = admin.buscarArchivo((int)result.Id);

    try
    {
        using (var writer = new BinaryWriter(File.Open(nombre, FileMode.Create)))
        {
            writer.Write(bytes);
        }

        var p = Process.Start(nombre);

        p.WaitForExit();
    }
    catch (Exception exc)
    {
        InterfazUtil.error(exc.Message); // This shows a MessageBox
    }
    finally
    {
        File.Delete(nombre);
    }
}

Он отлично работает для docx, pdf, txt и т. д. Но когда я пытаюсь открыть изображение, файл успешно открывается с помощью Window Photo Viewer (Windows 7), но выдается исключение NullReferenceException.

Если я сначала закрою WPV, а затем MessageBox, файл будет удален из временной папки.

Если я сначала закрою MessageBox, то изображение исчезнет из WPV, и после того, как я закрою WPV, файл не будет удален из временной папки.

Теперь, если я удалю блок catch, WPV успешно откроет файл, и после его закрытия файл не будет удален из временной папки. Очевидно, что приложение падает, потому что исключение не управляется.

Похоже, проблема в WPV.

Есть идеи, что не так?

ТИА

РЕДАКТИРОВАТЬ:

Исключение выбрасывается в

p.WaitForExit();

person Community    schedule 21.06.2013    source источник
comment
Вы знаете что-нибудь еще о NullReferenceException? Что такое null... какая строка кода его выдает?   -  person DonBoitnott    schedule 21.06.2013
comment
@DonBoitnott Спасибо. Пропустил его. Исключение выдается при вызове WaitForExit.   -  person    schedule 21.06.2013
comment
Похоже, вы не получили действительный p от Start(). Это правильно?   -  person DonBoitnott    schedule 21.06.2013
comment
@DonBoitnott Когда я отлаживаю код, я вижу, что p имеет значение null при вызове WaitForExit.   -  person    schedule 21.06.2013
comment
@DonBoitnott Думаю, ты прав. Как я могу вернуть допустимый p?   -  person    schedule 21.06.2013


Ответы (2)


Согласно этому MSDN: http://msdn.microsoft.com/en-us/library/53ezey2s.aspx

... вы не получите обратно объект Process, когда процесс уже запущен.

Я нашел это на форуме, посвященном природе WindowsPhotoViewer:

На самом деле средство просмотра фотографий Windows является частью проводника Windows и обычно запускается в процессе Explorer.exe. На самом деле то, что вы называете Photo Viewer, на самом деле является просто глаголом «предварительного просмотра» для изображений. Это не отдельное приложение, и открывать его без изображения или изображений не имеет смысла.

Таким образом, вы не получите обратно объект Process, потому что он уже запущен в силу того факта, что explorer.exe уже запущен.

В конце концов, я думаю, это означает, что если ваши изображения откроются в WindowsPhotoViewer, вы не сможете заставить WaitForExit() работать, потому что процесс владельца никогда не завершится.

person DonBoitnott    schedule 21.06.2013
comment
Спасибо за вашу помощь. В любом случае мне нужно найти другой способ сделать это, потому что теперь я вижу, что приложение не отвечает, пока я не закрою открытый процесс. - person ; 21.06.2013

Когда вы сначала закрываете MessageBox, временный файл не удаляется, потому что WPV использует его и не разрешает.

person Bogdan Alexandru    schedule 21.06.2013