在我正在进行的项目中,我正在开始一个外部流程。但是,外部进程是复杂程序的EXE,它从用户文件夹加载当前用户信息。该程序的桌面快捷方式通过将“Target:”参数设置为X:\exepath\prgm.exe
并将“Start In”参数设置为用户的路径X:\exepath\users\username
来解决问题。
我目前正在启动这样的流程:
Process p = new Process();
p.StartInfo = new ProcessStartInfo( "X:\exepath\prgm.exe" );
p.StartInfo.WorkingDirectory = "X:\exepath\users\username";
p.Start();
while (!p.HasExited) { }
但是,当进程启动时,它启动的程序最终会查找WorkingDirectory
中的所有资源,而不是从该文件夹中提取用户内容以及EXE所在目录中的所有其他内容。这表明 Working Directory
和系统快捷方式“Start In:”参数的行为方式不同。
有没有办法用C#进程模仿这种行为?或者,是否可以在C#中创建一个快捷方式,然后我可以从我的Process调用开始?
如果有更多信息可以提供帮助,请与我们联系。
编辑 -
经过多次试验和错误后,我决定使用WSH to create a shortcut并运行它。 WSH使用名称WorkingDirectory作为“Start In:”参数的值。它的行为与我上面代码中的进程执行情况相同。我仍然得到错误。
答案 0 :(得分:1)
差异可能是由于使用Shell Process执行:http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.useshellexecute.aspx
WorkingDirectory属性的行为 当UseShellExecute是 比UseShellExecute为真 假。当UseShellExecute为true时, WorkingDirectory属性 指定的位置 可执行文件。如果WorkingDirectory是一个 空字符串,当前目录是 理解为包含可执行文件。
当UseShellExecute为false时, 不使用WorkingDirectory属性 找到可执行文件。相反,它是 由启动的进程使用 并且只有在...内有意义 新流程的背景。
我怀疑如果你将p.StartInfo.UseShellExecute设置为false,它可能会按照你想要的行为。
答案 1 :(得分:1)
我已经解决了我的问题,毕竟这与创建一个过程无关。事实上,根本原因是有点尴尬,但有潜在的教育意义,所以我会提供一个解释。
我在OP中发布的代码是用于说明问题的示例代码。在我的实际项目中,我从注册表项中检索ExePath
和UserPath
。该项目是一个Chooser工具,用于在多个已安装的第三方软件版本之间切换,并读取/编辑这些注册表项以完成其工作。
当我将写入的代码写入注册表时,我使用了DirectoryInfo.FullPath
,它返回"X:\ExePath"
而不是"X:\ExePath\"
。这使程序无法从ExePath文件夹中找到所需的文件,查找X:\ ExePathsettings.inf“而不是”X:\ ExePath \ settings.inf“。我将尾部反斜杠插入到我的代码和现有的注册表中entires,一切正常。
获得的经验教训:请务必非常仔细地检查您的路径值。