1

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;
        }
4

2 に答える 2

3

画像をロードしている場合は、操作が完了したらストリームを閉じていることを確認してください。例えば、

using(var fs = new FileStream(...))
{
   // ...
}  // <-- Stream is closed and disposed.
于 2013-04-29T17:24:39.643 に答える