私たちのシステムでは、ほとんど制御できないサードパーティの実行可能ファイルを監視しています。これを TheServer.exe と呼びましょう。C++ Builder でビルドされていると思います。TheServer が誤動作する場合があり、それを強制終了して再起動する必要があります。これを自動化するためにいくつかの C# コードを書いていますが、を使用して TheServer.exe を起動するとProcess.Start()
、TheServer から「外部例外 E0434F4D」というエラー ダイアログが表示されます。
エクスプローラーまたはコマンド ラインから TheServer を起動すると、エラーは発生しません。また、Visual Studio 2010 でデバッグ モードでプロセスを開始しようとしましたが、エラーも発生しませんでした。に加えProcess.Start
て、私は P/Invoke 呼び出しを試しましたがShellExecute
、CreateProcess
同じ結果が得られました。.Net からプロセスを開始できる他の方法はありますか?
私が今使っているコード:
const string path = @"C:\Program files\TheServer\TheServer.exe";
ProcessStartInfo psi = new ProcessStartInfo()
{
FileName = path,
WorkingDirectory = Path.GetDirectoryName(path),
UseShellExecute = true, // Tried false as well
};
Process.Start(psi);
編集: Hans Passant によるこの回答を見つけたとき、中間プログラムとして非常に小さな C++ プログラムを作成しました。
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ShellExecuteA(NULL, "open", lpCmdLine, "", "", SW_NORMAL);
return 0;
}
を使用してコマンドラインからこれを実行するRun.exe TheServer.exe
と、プログラムはエラーなしで起動します。.Net から同じコマンド ラインを実行すると、以前と同じエラー ダイアログが表示されます。
編集:この質問は私のものと非常に似ていますが、私は Xenocode Postbuild を使用していません。それは問題の一部に過ぎないと思います。しかし、示唆されているように、コードをステップ実行しようとすると、exe はエラーなしで開始されます。本当に奇妙です。