リモートホストからEXEを更新する方法 - C#4.0 - WPFアプリケーション

StackOverflow https://stackoverflow.com/questions/8409236

  •  29-10-2019
  •  | 
  •  

質問

リモートサーバーからexeを更新したい。したがって、ボタンが私のwpfアプリケーションをクリックすると、リモートとリモートのtxtファイルがダウンロードされ、exeが実行されているのと同じフォルダーにある現在のファイルが置き換えられます。そのため、exeの実行中に、現在のtxtファイルとexeファイルが上書きされます。どうすればこれを達成できますか?

リモートホストはwww.mydomain.com/MyAPP.exeのようなURLです

wpfアプリケーション、c#4.0

役に立ちましたか?

解決

この問題を解決する方法は、最初にクライアントマシンにインストールおよび展開されたものとしてシェルexeを作成することでした。

「実際の」実行プログラムは、この最初のアプリのサブディレクトリに格納されています。シェルアプリが起動されると、Real Appのアップデートをダウンロードしてインストールした後、別のAppDomainでReal Appの実行可能ファイルを起動します。

これは、シェルアプリ内から起動する「実際の」アプリの中核です。

        System.AppDomainSetup oSetup = new System.AppDomainSetup();
        string sApplicationFile = null;

        // Use this to ensure that if the application is running when the user performs the update, that we don't run into file locking issues.
        oSetup.ShadowCopyFiles = "true";
        oSetup.ApplicationName = sAppName;

        // Generate the name of the DLL we are going to launch
        sApplicationFile = System.IO.Path.Combine(sApplicationDirectory, sAppName + ".exe");

        oSetup.ApplicationBase = sApplicationDirectory;
        oSetup.ConfigurationFile = sApplicationFile + ".config";
        oSetup.LoaderOptimization = LoaderOptimization.MultiDomain;

        // Launch the application
        System.AppDomain oAppDomain = AppDomain.CreateDomain(sAppName, AppDomain.CurrentDomain.Evidence, oSetup);
        oAppDomain.SetData("App", sAppName);
        oAppDomain.SetData("User", sUserName);
        oAppDomain.SetData("Pwd", sUserPassword);

        oAppDomain.ExecuteAssembly(sApplicationFile);

        // When the launched application closes, close this application as well
        Application.Exit();
.

私たちのバージョンでは、シェルアプリはアップデートのWebサイトに正しくアクセスするために、ユーザーからユーザー名とパスワードを収集します。このデータは、AppDomainのSetDataメソッドを介して "Real"アプリに渡されます。

他のヒント

解決策はあなたの特定のケースによって異なります。しかし、それらがメモリにロードされて使用されている間にアセンブリを更新することができないので、まっすぐな解決策はありません。私は2つの解決策を提案することができます:シャドウコピーを使用して、ある種のヘルパーを使用する実行可能ファイル私はそれらの両方を使いました。

影コピー

明らかな方法は、あなたのメインの実行可能ファイルをシャドウコピーにすることで、アプリの実行中にそれを置き換えてからアプリを再起動します。しかし、あなたのあなたのデフォルトのアプリケーションドメインをシャドウコピーすることができないようにすることはできません。しかし、あなたはまだあなたのすべてのコードを別のアセンブリに移動することができ、あなたのメインアプリケーション実行ファイル(Mainapp.exe)を "ローダーコード"に含まれるように書き換えることができます。このローダーコードは別のアプリケーションドメインを作成し、それをシャドウコピーにするように設定してから、セカンダリAppドメインでプログラムロジックを実行します。メインアプリケーションドメインからMainApplib.dllへの直接参照を持たないため、このアセンブリはシャドウコピーではなく、アセンブリファイルがロックされます。ほとんどの場合、 appdomain.executeassembly()メソッド

ヘルパー実行可能

アイデアは、ある種の更新フィニッシャを使用することです。あなたのメインアプリは変更されません、あなたはそれに少量のコードを追加するだけで、あなたのアプリは更新をダウンロードし、それを一時フォルダに入れ、あなたのメインアプリは更新フィニッシャーを開始します( )そして出る。 Update Finisherは、アプリが閉じるまで待機してから、一時フォルダからすべてのファイルを置き換えるアプリフォルダに新しいファイルをコピーします。更新フィニッシャはそれ自身の実行可能ファイルを置き換えることはできませんが、更新フィニッシャを起動する前にメインアプリケーションによって実行できます。ファイルをコピーした後、更新フィニッシャはアプリケーションを実行します。

P.S。そして、必要な場合はプラグインを使用することができます(例: MEFフレームワーク)。しかし、後者は、アプリケーションドメインと手動アセンブリのロードを使用したことがない場合は、理解が簡単です。

おそらく clickonce (上記のコメントに基づいてあなたは別のアセンブリを受ける準備ができています......他のポスターが言及されているように、実行中のアセンブリを置き換えることはできません。新しいバージョンのためにさまざまな時刻(起動時に)チェックするように設定することができ、自動的にそれらをダウンロードします。その非常に堅牢な解決策とあなたは展開アセンブリと一緒にすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top