0

私たちのシステムでは、ほとんど制御できないサードパーティの実行可能ファイルを監視しています。これを TheServer.exe と呼びましょう。C++ Builder でビルドされていると思います。TheServer が誤動作する場合があり、それを強制終了して再起動する必要があります。これを自動化するためにいくつかの C# コードを書いていますが、を使用して TheServer.exe を起動するとProcess.Start()、TheServer から「外部例外 E0434F4D」というエラー ダイアログが表示されます。

エクスプローラーまたはコマンド ラインから TheServer を起動すると、エラーは発生しません。また、Visual Studio 2010 でデバッグ モードでプロセスを開始しようとしましたが、エラーも発生しませんでした。に加えProcess.Startて、私は P/Invoke 呼び出しを試しましたがShellExecuteCreateProcess同じ結果が得られました。.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 はエラーなしで開始されます。本当に奇妙です。

4

2 に答える 2

0

これが私がスピンしたばかりのメモ帳ランチャーです。それはうまくいきます

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            Process process = new Process();
            process.StartInfo.FileName = "notepad";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;

            process.Start();
        }
    }
}
于 2012-11-12T15:33:33.923 に答える
0

ああ、なんてばかだ。多くのテストとトラブルシューティングを行った後、問題を特定することができました。結局、Process.Start とは何の関係もありませんでした。新しいプロセスが開始されたことを検出すると、そのプロセスへの Telnet 接続を開き、そのステータスを照会します。それが早すぎると、エラー メッセージが表示されます。ええと、すべてをフォローしてくれてありがとう。

于 2012-11-14T08:59:27.670 に答える