用的ProcessStartInfo C#问题
我使用的ProcessStartInfo修补文件有这样一个文本文件(通过CMD.EXE):用的ProcessStartInfo C#问题
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)不理解参数。解决此问题的最佳方法是使用在不起作用的情况下提供的参数来调试app.exe。尝试将app.exe的调试器中的参数设置为与失败案例完全相同的参数,然后检查解析参数后得到的变量。
像这样调试问题的常用方法是使用调试器。一旦
System.Diagnostics.Debugger.Break();
为APP.EXE开始运行时,你会得到一个对话框,让你选择一个调试器:复制/粘贴成“APP.EXE”源文件的Main()方法。从那里你不应该很难找出为什么它不起作用。
如果您没有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...
好的,我将使用调试器测试应用程序(虽然它是用C++编写的,但我假设我可以使用MSVC++进行调试)并感谢有关程序的默认目录更改的信息,我不知道.. – david 2010-10-21 12:27:59
它是MSVC中的__debugbreak()。 – 2010-10-21 13:07:18
能修补路径包含空格?如果是这样,你需要把它放在引号中。 – 2010-10-20 09:38:46
什么不工作? – 2010-10-20 09:39:12
你能提供一个真正的路径吗?我怀疑你有一个空间的路径,在这种情况下,你必须用引号括住你的路径(“) – Onkelborg 2010-10-20 09:39:21