この記事を書いた経緯
ある実行ファイル(exeName)を用いた非同期処理のプログラムは、Processを起動させる際の変数ProcessStartInfoを以下のように設定すればよい。
string args = ConstructArgs(); // なんらかの引数をメソッドで構築している
string exeName = ExeFileName; // 実行ファイル名
ProcessStartInfo psinfo = new ProcessStartInfo(exeName, args);
ローカルの環境で、新しくパスを指定した実行ファイルに対してこのような処理を書いていた際に
"System.ComponentModel.Win32Exception (0x80004005): 指定されたファイルが見つかりません。"
というエラーが出たので、その際の対処方法を記しておく。
現象が起きた時の状況
開発用PCに、psql(PostgreSQLのターミナル型フロントエンド)をインストールし、システムのPath変数にpsql.exeの存在するフォルダのパスを設定し、そのままVSでの開発を続行した場合に、上記エラーが発生。
コマンドプロンプトを立ち上げてpsqlと打つとパス自体は正しく設定されている様子だったため、ネットを調べるが役に立ちそうな上は見つからず。
結論
Windowsの再起動を行うことで、Processで実行される環境にpsqlへのPathが反映されるようになりました。
VSの再起動だけでは反映されなかったことから、Windows起動時に環境変数のスナップショットが読み込まれているのかと想像しているのだけれど、詳細は不明。
Windows7上のVS2015で発生した事象なので、Windows10環境では起きないのかもしれないが、Windowsの再起動という力技が時として役に立つことを再認識しました。
2020/3/12 追記##
Windows Server 2019のIISで動いている.NETアプリケーションからプロセスを起動した際にも同様の事象が発生しました。
今回の場合もOSの再起動で事象が解決したことから、環境変数にパスを追加した場合にはなるべく早いタイミングでOS再起動を行わないと、その環境変数をあてにしたプロセスが正しく開始できない場合があるという認識を持つ必要があるようだ。パスの追加はアプリのインストール時に自動で追加される場合があるので、アプリの追加時にもOS再起動という多少過剰かもしれない対応を想定しておくことも考えられる。
特にサーバーの場合、新規アプリのインストールや環境変数の追加を行った場合にアプリ単体の起動確認で作業を完了してしまうと、次に再起動が可能となるタイミングを調整するのが難しい場合があるのでより注意が必要そうである。