不止一条重要的路径.NET进程

本文关键字:NET 进程 路径 重要的 一条 不止 | 更新日期: 2023-09-27 18:00:13

在我目前正在处理的项目中,我正在启动一个外部流程。但是,外部进程是从用户文件夹加载当前用户信息的复杂程序的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#中创建一个快捷方式,然后从流程调用开始?

请告诉我更多的信息是否会有帮助。

编辑-

经过更多的尝试和错误,我决定使用WSH创建一个快捷方式并运行它。WSH使用WorkingDirectory作为"Start-In:"参数的值。它在引擎盖下的行为与上面代码中进程的执行相同。我仍然会出错。

不止一条重要的路径.NET进程

差异可能是由于使用Shell进程执行:http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.useshellexecute.aspx

WorkingDirectory属性的行为UseShellExecute为当UseShellExecute为false。当UseShellExecute为true时,WorkingDirectory属性指定的位置可执行文件。如果WorkingDirectory是空字符串,当前目录为理解为包含可执行文件。

当UseShellExecute为false时未使用WorkingDirectory属性以查找可执行文件。相反,它是由启动的进程使用并且仅在新流程的上下文。

我怀疑如果您将p.StartInfo.UseShellExecute设置为false,它可能会按照您的意愿运行。

我已经解决了我的问题,毕竟这与创建流程无关。事实上,根本原因是有点尴尬,但可能具有教育意义,所以我将提供一个解释。

我在OP中发布的代码是用来说明这个问题的示例代码。在我的实际项目中,我从注册表项中检索ExePathUserPath。该项目是一个Chooser工具,用于在多个已安装的第三方软件版本之间切换,并读取/编辑这些注册表项以完成其工作。

当我编写写入注册表的代码时,我使用了DirectoryInfo.FullPath,它返回了"X:'ExePath"而不是"X:'ExePath'"。这使得程序无法从ExePath文件夹中找到所需的文件,只能查找X:''ExePathsettings.inf而不是"X:''ExePath''settings.inf"。我在代码和现有注册表项中插入了尾部反斜杠,一切都很好。

经验教训:始终非常、非常仔细地检查您的路径值。