私は小さなVB6アプリケーション/ツールを書き直しています。その仕事は、レガシーVB6アプリの最新バージョンをインストールすることです。従来の VB6 アプリは、ビルドされて実行可能なインストーラーにパッケージ化された ActiveX DLL です (一部の Inno Setup スクリプトは、 という名前のインストーラーをビルドしますcompanynameSetup.exe
)。
書き直されている従来の VB6 アプリ:
- ActiveX DLL を消費するすべてのプロセスを強制終了します (すべてのログイン ユーザーにわたって)
- 現在の ActiveX DLL をアンインストールします
- ActiveX DLL の新しいバージョンをインストールします
- UI を無効にするコマンドライン引数で実行可能
書き直された C# アプリも、上記のすべてを実現します。唯一の違い (新しい外観を除く) は、UI の有無に関係なく、VB6 コードは UAC プロンプトをトリガーしないことです。
Shell(pathAndFileName, vbNormalFocus)
ただし、このコードはインストーラー実行可能ファイルの UAC を表示します (アンインストーラーが最初に実行され、プロンプトは表示されません)。
var startInfo = new ProcessStartInfo(path, args);
using (var process = Process.Start(startInfo))
{
while (!process.HasExited && _timerTicks < _timeoutTicks) Thread.Sleep(100);
//... (log stuff, handle timeout, etc.)
}
これは、スケジュールされたタスクとして実行した後のログ ファイルです。
2013-06-12 21:49:00.8555 | Info | AutoDeploy.App | COMPUTER : somedomain\someadminuser | StartUp. ShowUI=False; TimeOut=100 |
...
2013-06-12 21:50:40.4447 | Trace | AutoDeploy.App | COMPUTER : somedomain\someadminuser | Installer timer interval has elapsed (ticks: 99). |
2013-06-12 21:50:41.4446 | Trace | AutoDeploy.App | COMPUTER : somedomain\someadminuser | Installer timer interval has elapsed (ticks: 100). |
2013-06-12 21:50:41.4602 | Warn | AutoDeploy.App | COMPUTER : somedomain\someadminuser | Process execution has timed out. Process may be hung. |
GUI を使用して手動で実行すると、(UAC を許可した後) 数秒以内にすべてが実行されるため、プロセスは UAC で停止する必要があります。したがって、VB6 コードは一晩中無人で実行できますが、書き直され、新しく改善された (ログ、障害通知、すべての楽しい機能が実装されています!) C# アプリは実行できません。では、VB6 はどのように注目されないのでしょうか?
問題は、UAC が台無しにすることなく、インストーラーを無人で実行するようにスケジュールするにはどうすればよいかということです。タスクをスケジュールすることで問題が解決する場合、タスクをどのように設定する必要がありますか? また、アセンブリを機能させるためにアセンブリに追加/削除する必要がある特別なものはありますか?
編集
解決策は簡単でした:
var startInfo = new ProcessStartInfo(path, args) { UseShellExecute = False };