C# 仅当从数据库打开图像时出现NullReferenceException
我的数据库中有一个存储各种文件的表 文件名显示在列表视图中,当用户点击其中一个文件名时,它将由注册的应用程序根据文件扩展名打开 代码如下:C# 仅当从数据库打开图像时出现NullReferenceException,c#,nullreferenceexception,process.start,waitforexit,C#,Nullreferenceexception,Process.start,Waitforexit,我的数据库中有一个存储各种文件的表 文件名显示在列表视图中,当用户点击其中一个文件名时,它将由注册的应用程序根据文件扩展名打开 代码如下: if (listViewArchivos.HasItems) { dynamic result = listViewArchivos.SelectedItem; var nombre = Path.GetTempPath() + admin.buscarNombreArchivo((int)result.Id); var bytes
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等都可以正常工作。但是当我尝试打开图像时,Windows照片查看器(Windows 7)成功打开了该文件,但引发了NullReferenceException
如果我先关闭WPV,然后关闭MessageBox,则该文件将从临时文件夹中删除
如果我先关闭MessageBox,则图像将从WPV中消失,关闭WPV后,文件不会从临时文件夹中删除
现在,如果我删除catch块,那么WPV将成功打开该文件,并且在关闭该文件后,该文件不会从temp文件夹中删除。显然,应用程序崩溃是因为没有管理异常
看起来问题出在WPV上
你知道怎么回事吗
短暂性脑缺血发作
编辑:
异常被抛出
p.WaitForExit();
当您首先关闭MessageBox时,不会删除临时文件,因为WPV使用它并且不允许它。根据此MSDN: …当进程已在运行时,您将无法返回
进程
对象
我在一个有关WindowsPhotoViewer性质的论坛上发现了以下内容:
实际上,Windows照片查看器是Windows资源管理器的一部分
通常在Explorer.exe进程中运行。事实上,你在说什么
调用照片查看器实际上只是图像的“预览”动词。
它不是一个独立的应用程序,打开它时没有图像或
图像真的没有任何意义
因此,由于explorer.exe
已在运行,因此您不会返回进程
对象,因为它已在运行
最后,我认为这意味着如果您的图像在WindowsPhotoViewer中打开,您将无法使
WaitForExit()
工作,因为所有者进程将永远不会退出。您是否了解有关NullReferenceException
的更多信息?什么是空的…是哪行代码抛出的?@DonBoitnott谢谢。错过了。调用WaitForExit时引发异常。您似乎没有从Start()
返回有效的p
。对吗?@DonBoitnott当我调试代码时,我可以看到调用WaitForExit时p为null。@DonBoitnott我认为你是对的。我怎样才能强制返回有效的p?谢谢你的帮助。无论如何,我必须找到另一种方法,因为现在我看到应用程序在关闭打开的进程之前不会响应。