我已经构建了一个在WPF中运行的数字标牌解决方案。我有一个可执行文件,负责处理调度和一些外部程序集(用户控件的.dll),负责显示图像,视频等。为什么我的图片被另一个进程锁定?
当应用程序启动时,它将所有程序集加载到列表中,然后使用与配置信息的XML文件上哪种幻灯片的开始与参数,像这样:
<signage>
<slide type="image" argument="c:\image1.png"/>
<slide type="image" argument="c:\image2.png"/>
<slide type="video" argument="c:\video1.mpg"/>
...
</signage>
该列表可能会很长,并包含许多不同的幻灯片。当我建立我的对象列表来显示我创建一个新的实例,通过反射,我需要显示的.dll,传递它的参数。这包含在一个列表中。父可执行程序然后遍历列表并在我的主WPF应用程序上显示用户控件实例(实例化的幻灯片类型)。
那就是我的问题的背景。
当我需要在运行时更新内容时,我需要替换磁盘上的文件(image1,image2等),但得到一个异常,该文件正在被另一个进程使用,并且我无法访问它们。
关于如何解决这个问题的任何想法?有什么办法可以从我的应用程序中“卸载”它们吗?有没有办法以适当的方式做到这一点?
编辑 这里是我如何做到这一点的图像组件一些额外的信息:
public ImageExtensionControl(XmlDocument document, Dictionary<string, string> settings, Action slideFinished)
{
InitializeComponent();
string path = new FileInfo(Assembly.GetCallingAssembly().Location).Directory.FullName;
string id = settings["Image"];
path = System.IO.Path.Combine(path, document.SelectSingleNode("properties/files/file[@id='" + id + "']").Attributes["path"].Value);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(path, UriKind.Absolute);
bitmapImage.EndInit();
this.myimage.Source = bitmapImage;
}
不言自明的:也许他们都与Windows图片查看器,你的应用程序的另一个副本开放,或者你不关闭使用它的流。如果他们刚刚写信,它可能是防病毒/安全软件将其打开。如果有人通过网络共享打开相同的消息也适用。 – 2013-04-29 17:54:30