リモートホストからEXEを更新する方法 - C#4.0 - WPFアプリケーション
-
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()メソッド
P.S。そして、必要な場合はプラグインを使用することができます(例: MEFフレームワーク)。しかし、後者は、アプリケーションドメインと手動アセンブリのロードを使用したことがない場合は、理解が簡単です。
おそらく clickonce (上記のコメントに基づいてあなたは別のアセンブリを受ける準備ができています......他のポスターが言及されているように、実行中のアセンブリを置き換えることはできません。新しいバージョンのためにさまざまな時刻(起動時に)チェックするように設定することができ、自動的にそれらをダウンロードします。その非常に堅牢な解決策とあなたは展開アセンブリと一緒にすることができます。