3

自分自身を更新できるソフトウェア アプリケーションを作成しています。開始後、アプリケーションは利用可能な更新があるかどうかを確認し、それらのファイル (アセンブリ) をダウンロードしてから、それらの読み込みを続行します。

ただし、問題は、アプリケーションが同時に複数のユーザーによって実行される場合です。これは、ターミナル サーバーで実行しているときに発生します。Windows は古いファイルをロックしたままにするため、アプリケーションはこれらの古いファイルを置き換えることができません。

この問題を解決する簡単な方法はありますか? これはレガシー アプリケーションであり、アプリケーションの大部分や更新メカニズムを変更する時間がありません。

4

4 に答える 4

3

Windowsでは、使用中のファイルの名前を変更できますしたがって、更新されたファイルに名前を変更し、それらを新しいバージョンに置き換えて、アプリケーションを再起動することができます。

更新メカニズムを変更せずにこれを解決することはできないと思います。

于 2012-06-08T08:06:32.583 に答える
3

ほとんどのアップデータには、メイン アプリケーションの更新を実行するブートストラップ実行可能ファイルがあります。

アイデアは、アプリケーションの代わりにブートストラップを実行することです。次に、ブートストラップは、実際のアプリケーションを起動する前に、必要に応じて更新を適用します。

もう 1 つの手法 (試したことはありません。手がかりにすぎません) は、シャドウ アセンブリを使用することです。概念は、使用中のファイルのロックを回避するために、ファイルのアセンブリを「複製」することです。

最後に、このメカニズムの欠点を受け入れるのであれば、自己更新アプリケーションを簡単に作成できるclickonceを見てみましょう。

于 2012-06-08T08:12:04.377 に答える
1

簡単な解決策は、シャドウ コピーを使用することです。

簡単な例:

class Program
{
    static void Main(string[] args)
    {
        var x = AppDomain.CreateDomain("TestAssembly", null, new AppDomainSetup() { 
                                                            ShadowCopyFiles = "true",
                                                            CachePath = @"c:\tmp", 
                                                            ApplicationName = "ShadowCopyTest"
                                                       });
        var a = x.Load("TestAssembly"); // Load Assembly and run...
    }
}

シャドウ コピーを使用して、アプリケーションをロードする実行可能ファイルを作成できます (実行可能ユーザーは現在開始しています)。CachePathユーザーの一時ディレクトリなど、ユーザー固有である必要があります。

このようにして、各ユーザーは、アプリケーションによって読み込まれたすべてのアセンブリのコピーを作成します。ただし、コピーされたファイルを自分でクリーンアップする必要があります。

あとは、アプリケーションが新しいラッパー実行可能ファイルによって確実に開始されるようにするだけです。

于 2012-06-08T08:09:13.207 に答える
0

古いアセンブリの代わりにアセンブリを直接ダウンロードしていると思います。アセンブリ myprogram.dll があるとします。最初に、更新された新しい dll を別の名前 (たとえば _myprogram.dll) でダウンロードします。ダウンロードが完了したら、myprogram.dll を _myprogram.dll に置き換えるイベントを発生させます。このイベントは、実行中のすべてのプロセスを最初に停止し、次にアセンブリを置き換えることを宣言する必要があります。すぐに交換できます。この瞬間のサービスカットは避けられません。

編集:

常に実行して更新をチェックするプロセスが必要です。最初にファイルの名前をこのプロセスに送信します。プロセスは、たとえば 5 つのファイルをダウンロードします。このプロセスでは、定義済みの名前形式でファイルをダウンロードする必要があります (たとえば、アンダースコアで連結します)。プロセスが 5 番目のファイルのダウンロードを終了した後、プロセスは他のすべてのプロセス (または、できればダウンロードしたアセンブリに関連するプロセスのみ) を強制終了し、アセンブリを新しいものに置き換えます。プロセスを再度開始します。

于 2012-06-08T08:09:43.503 に答える