1

ProcessStartInfo を使用して、(cmd.exe を介して) 次のようなテキスト ファイルでファイルにパッチを適用しています。

app.exe temp.txt patch.ips

私はこのコードを書きました:

ProcessStartInfo P = new ProcessStartInfo("app.exe");  
P.Arguments = "temp.txt " + _patchpath;  
P.CreateNoWindow = true;  
P.UseShellExecute = false;  
P.RedirectStandardOutput = true;  
Process.Start(P);

app.exe と temp.txt は、アプリケーション パスからの相対パスです (注: app.exe は、C# アプリケーションの名前ではなく、プロセスに使用しているプログラムにすぎません) が、_patchpath は D のような絶対パスです。 :\何とか\file.ips。問題は、絶対的な場合はプロセスが機能しないことです (_patchpath はファイル temp.txt でパッチを適用する必要があります) が、アプリ ディレクトリに相対的な場合は機能します。それはなぜですか、どうすれば修正できますか?

明確にする必要がある場合は、お知らせください。

4

2 に答える 2

3

このような問題をデバッグする通常の方法は、デバッガーを使用することです。これをコピーして、'app.exe' のソース ファイルの Main() メソッドに貼り付けます。

        System.Diagnostics.Debugger.Break();

app.exe の実行が開始されるとすぐに、デバッガーを選択できるダイアログが表示されます。そこから、それが機能しない理由を理解するのにそれほど苦労する必要はありません。

app.exe のソース コードがない場合は、これについてよく考える必要があります。「app.exe」や「temp.txt」などの相対パスを使用すると、常に問題が発生します。古典的な失敗モードは、OpenFileDialog を使用して、ユーザーが _patchpath 値を選択できるようにすることです。そのダイアログの RestoreDirectory プロパティが True に設定されていない場合、プログラムのデフォルト ディレクトリはパッチ ファイルのパスに変更されます。また、app.exe も temp.txt も 4 番目にはなりません。

防御的にプログラミングすることで、これから身を守ります。

        var myPath = System.Reflection.Assembly.GetEntryAssembly().Location;
        var homeDir = System.IO.Path.GetDirectoryName(myPath);
        var appPath = System.IO.Path.Combine(homeDir, "app.exe");
        var tempPath = System.IO.Path.Combine(homeDir, "temp.txt");
        ProcessStartInfo P = new ProcessStartInfo(appPath);
        P.WorkingDirectory = homeDir;
        P.Arguments = string.Format("\"{0}\" \"{1}\"", tempPath, _patchpath);
        // etc...
于 2010-10-20T12:40:34.410 に答える
1

問題は、呼び出されたアプリケーション(app.exe)がパラメーターを理解していない可能性があります。この問題を解決する最善の方法は、機能しない場合に備えて、指定したパラメーターを使用してapp.exeをデバッグすることです。app.exeのデバッガーで、失敗した場合とまったく同じパラメーターに引数を設定し、引数の解析から生じる変数を調べてみてください。

于 2010-10-20T10:29:27.340 に答える