仅在从数据库打开图像时才出现NullReferenceException

时间:2013-06-21 13:00:42

标签: c# nullreferenceexception process.start waitforexit

我的数据库中有一个存储所有类型文件的表。

文件名显示在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。

知道什么是错的?

TIA

编辑:

抛出异常
p.WaitForExit();

2 个答案:

答案 0 :(得分:1)

首先关闭MessageBox时,临时文件不会被删除,因为WPV使用它并且不允许它。

答案 1 :(得分:0)

根据此MSDN:http://msdn.microsoft.com/en-us/library/53ezey2s.aspx

...当进程已经运行时,你将取回Process对象。

我在一个与WindowsPhotoViewer性质相关的论坛上发现了这个:

  

实际上,Windows Photo Viewer是Windows资源管理器的一部分,而且   通常在Explorer.exe进程中运行。事实上,你是什么   调用照片查看器实际上只是图像的“预览”动词。   它不是一个独立的应用程序,并且没有图像或打开它   图像实际上没有任何意义。

因此,由于已经在运行,因为Process已经在运行,所以你没有找回explorer.exe对象。

最后,我认为这意味着如果您的图片在WindowsPhotoViewer中打开,您将 无法使WaitForExit()工作,因为所有者进程永远不会退出。