質問: Visual studio(C#)でコンパイルした、 Windows EXE実行ファイルのリリースについて質問です。 バッチシステムとしてタスクスケジューラーで起動させますが、 頻繁にシステム改修があり、都度リリースが必要です。 しかし、システム実行中にリリース(EXEファイルの上書き)を行うと、 起動中のため上書きエラーとなります。 実行中のEXEに対して、 次回の実行分から最新のシステム改修を反映させるには、 どのようにしたら良いでしょうか? 以下私の案がございますが、スマートではありませんし、 実行開始に時間がかかるデメリットがございます。 他にスマートな案はございますでしょうか? 起動に関するフレームワークなどあるのでしょうか。 <案> 1.処理開始時に本体EXEファイルをコピーして実行版EXEファイルを作成する(同一のEXEファイル) 2.実行版EXEファイルを起動する 3.実行中でも本体EXEファイルは上書き可能なため、本体EXEファイルに対してリリース(EXEファイルの上書き)を行う
回答: システムを起動したまま、該当プログラムだけ入れ替えたいなら、 以下のいずれかで該当プログラムを明示的に終了させてから入れ替えて、 該当プログラムの再起動を行う方法が考えられます。 1. 該当プログラムに、WM_CLOSE メッセージを投げて終了させる。 2. 該当プログラムに、プログラムを終了させる機能を示すユーザー定義メッセージ処理を組み込み、それを投げて終了させる。 3. 該当プログラムに、名前付きイベント等の通知でプログラムを終了させる機能を組み込んでおき、それを実行する。 4. TaskKillコマンドや、TerminateProcessAPIで、該当プログラムを強制終了させる。 該当プログラムは、強制終了されても問題ないように設計/製作しておく。 あと、これは裏技的ですが、実行中のプログラムでもリネームは出来ます。 プログラム実行中のEXEファイルのファイル名変更ができる! * 現行プログラムをリネーム * 新しいプログラムを同じ場所にコピー * プログラム起動後にリネームした古いファイルがあったら削除 正統的には、システムの再起動まで待てるのならば、Windows SysinternalsのPendMoves と MoveFileツールが使えるでしょう。 ツールで使っているMoveFileExAPIを使って自分でツールを作っても良いですし。 多数のファイルがあって、依存関係とか設定変更などがあるなら、Windows Installerに沿ったインストールパッケージを作成した方が良いでしょう。 こんなツールがあります。WiX チュートリアル 日本語訳 @774RRさんコメントを見て検索したところ、確かにVisualStudioで簡単にできそうです。 アプリケーションを ClickOnce で発行する ただしこんな情報もあって、今も適用されるか不明ですが、質問者さんの用途に合わないかも。 権限 - ClickOnce > > 「ClickOnce」では、インターネット環境から不特定多数に向けて配信されるWebアプリケーションのような利用を可能とするために、インストールの垣根を下げる必要があり、管理者権限が無くてもインストールが可能となっている 。 > > > * このため、インストール先(正確にはキャッシュ領域 )は、”%USERPROFILE%\Local Settings\Apps”以下のディレクトリから変更することはできなくなっている(このためユーザ毎、別々にアプリケーションがストレージにキャッシュされることになる)。 > * リソースやデータの保存先のストレージもこの環境変数「USERPROFILE」以下のディレクトリを使用するのが慣例となる(これは、セキュリティの関係上、他のユーザにデータを参照させないようにするためである。 > * 「分離ストレージ」 を活用すれば、「ClickOnceアプリケーション」間のデータ保護も可能である)。 > > > UAC - ClickOnce > > 管理者権限を持つClickOnceアプリケーションを実行することはできない。 > > ~途中省略~ > > ここにはハックがあり、管理者権限を持つ新しいプロセスを開始することはできる。 > > >