C# Process.Start(“IIS管理器.lnk”)失败,返回“0”;系统找不到指定的文件";
我正在通过C# Process.Start(“IIS管理器.lnk”)失败,返回“0”;系统找不到指定的文件";,c#,.net,windows,C#,.net,Windows,我正在通过Process.Start启动路径C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk,但由于系统找不到指定的文件而失败 该链接显示在目录上,因此它存在 可以吗 注: 通过迭代开始菜单目录,自动发现路径 我可以通过浏览器和命令行启动它 澄清: 代码如下: public void Execute(){Process.Start(_shortcut.FullN
Process.Start
启动路径C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk
,但由于系统找不到指定的文件而失败
该链接显示在目录上,因此它存在
可以吗
注:
- 通过迭代
开始菜单
目录,自动发现路径
- 我可以通过浏览器和命令行启动它
澄清:
- 代码如下:
public void Execute(){Process.Start(_shortcut.FullName);}
- _快捷方式的类型为FileInfo
- _Exists为true,因此可以找到该文件
- 将_shortcut.FullName替换为显式路径@“C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk”具有相同的效果
- 这是一个使用Caliburn和MEF的WPF应用程序李>
- 以管理员身份运行具有相同的效果
另一方面,这似乎是可行的:
[Fact]
public void TestIisManager()
{
var path = new FileInfo(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk");
Process.Start(path.FullName);
}
它似乎确实有点“环境”为基础
第二项澄清:
- 它似乎可以在Windows7x86中工作,但不能在Windows7x64中工作
这有点像黑客,但试着像这样启动它:
string path = @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk";
Process.Start("cmd.exe", String.Format("/k \"\"{0}\"\"",path));
注意保存路径中的空格所需的双引号。
这样,您可能会看到更精确的错误消息和/或随后在命令环境中查看路径的错误。这实际上可能与您的情况无关,但您可以使用
Process.Start("inetmgr.exe")
如果要继续使用快捷方式,如果使用ProcessStartInfo
启动进程并将ProcessStartInfo.UseShellExecute
设置为true
可以确保您正在STA线程中尝试此操作吗?如果以下示例成功,您可以看到单元状态是否存在问题:
using System;
using System.Diagnostics;
public class Program
{
// make sure to call Process.Start from an STA thread
[STAThread]
static void Main(string[] args)
{
Process.Start(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk");
}
}
Process.Start
调用ShellExecute
在引擎盖下运行传递的文件。如Raymond Chen所述,shell函数需要STA线程:
发现了问题
WPF应用程序编译为x86(所有其他DLL编译为AnyCPU),在64位机器中启动某些可执行文件或链接时失败
将“平台目标”更改为AnyCPU可以解决这个问题。我最近遇到了这个问题。基于Windows窗体的解决方案,VS2013,x64计算机。Process.Start()无法通过.lnk文件启动应用程序。使用process explorer,.lnk文件中指定的目标似乎无法正确解析为c:\program files(x86)。。。而不是c:\程序文件。。。我听从了布鲁诺的建议,但我的目标已经被标记为“AnyCPU”
经过一番深思熟虑之后,发现在VS11+中有一个新的编译器标志,名为“preference 32-bit”,它是默认选中的。这迫使EXE输出为32位,即使我的操作系统为64位,平台设置为AnyCPU。在我取消检查并重新编译后,问题得到了解决
更多阅读请访问:这对我很有效,因此我认为这是您的环境的问题。您是否使用任何进一步的选项来处理.Start()
?您正在使用完整路径吗?你是以其他用户的身份运行你的应用程序吗?这对我来说很好。让我们看一下代码中调用Process.Start()
的部分。您可以使用Sysinternals中的Process Monitor来找出流程实际查找该文件的位置。我认为,默认情况下,ProcessStartInfo.UseShellExecute设置为true,因为其他链接似乎可以工作。但我还是试过了,它仍然抛出了异常,所以我不得不禁用“首选32位”选项。见Sat Thiru的回答。