ProcessStartInfo 的 C# 问题

标签 c# arguments processstartinfo

我正在使用 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:\blah\file.ips。问题是,如果它是绝对的,则该过程不起作用(_patchpath 应该使用文件 temp.txt 进行修补),但如果它相对于我的应用程序目录,则它确实起作用。为什么会这样?我该如何解决?

如果我需要说清楚,请告诉我。

最佳答案

调试此类问题的常用方法是使用调试器。将其复制/粘贴到“app.exe”源文件的 Main() 方法中:

        System.Diagnostics.Debugger.Break();

一旦 app.exe 开始运行,您就会看到一个对话框,让您选择一个调试器。从那里你应该很容易弄清楚为什么它不起作用。

如果您没有 app.exe 的源代码,那么您需要仔细考虑一下。使用像“app.exe”或“temp.txt”这样的相对路径总是很麻烦。一种经典的故障模式是使用 OpenFileDialog 让用户选择 _patchpath 值。如果该对话框的 RestoreDirectory 属性未设置为 True,则程序的默认目录将更改为补丁文件的路径。 app.exe 和 temp.txt 都找不到了。

通过防御性编程来保护自己免受这种情况的影响:

        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...

关于ProcessStartInfo 的 C# 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3976456/

相关文章:

c# - 检查目的地的 AutoMapper 先决条件

javascript - 基于下拉选择的调用函数

c# - 如何运行一个不知道参数从哪里开始的程序?

ubuntu - ProcessStartInfo 无法识别 .sh 文件中的命令

c# - 将文本内容元素分配给绑定(bind)类中的 XmlNode[] 'Any' 属性的最简单方法?

c# - 解析 Xml 文档中的指数值

C++ 在同一函数中返回字符串引用并传递字符串引用

c++ - XCODE 4.6 C++ 模板函数,函数指针作为模板类中的参数

c# - ProcessStartInfo 卡在 "WaitForExit"上?为什么?

c# - Winforms Treeview 节点工具提示自定义