不止一条重要的路径.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:"参数的值。它在引擎盖下的行为与上面代码中进程的执行相同。我仍然会出错。
差异可能是由于使用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中发布的代码是用来说明这个问题的示例代码。在我的实际项目中,我从注册表项中检索ExePath
和UserPath
。该项目是一个Chooser工具,用于在多个已安装的第三方软件版本之间切换,并读取/编辑这些注册表项以完成其工作。
当我编写将写入注册表的代码时,我使用了DirectoryInfo.FullPath
,它返回了"X:'ExePath"
而不是"X:'ExePath'"
。这使得程序无法从ExePath文件夹中找到所需的文件,只能查找X:''ExePathsettings.inf而不是"X:''ExePath''settings.inf"。我在代码和现有注册表项中插入了尾部反斜杠,一切都很好。
经验教训:始终非常、非常仔细地检查您的路径值。