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();

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам