我正在使用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目录可以正常工作。为什么这样,我该如何解决?
如果我需要清楚,请告诉我。
答案 0 :(得分:3)
调试此类问题的常用方法是使用调试器。将其复制/粘贴到'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...
答案 1 :(得分:1)
问题很可能是被调用的应用程序(app.exe)无法理解参数。解决此问题的最佳方法是使用您提供的参数调试app.exe,如果它不起作用。尝试将app.exe的调试器中的参数设置为与失败案例完全相同的参数,并检查解析参数所产生的变量。