我通过Process.Start
启动pathC:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk
,但是失败, The system cannot find the file specified
。
该链接显示在一个dir
,所以它存在。
它可以是权限?
笔记:
Start Menu
目录来自动发现path。 澄清:
代码如下:
public void Execute(){Process.Start(_shortcut.FullName);}
_shortcut是FileInfotypes
另一方面,这里似乎工作:
[Fact] public void TestIisManager() { var path = new FileInfo(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk"); Process.Start(path.FullName); }
这似乎有点“环境”的基础。
第二个澄清:
发现问题。
WPF应用程序被编译为x86(所有其他dll被编译为AnyCPU),并在64位机器启动一些可执行文件或链接时失败。
将“平台目标”更改为AnyCPU可修复此问题。
我最近碰到了这个。 基于Windows Forms的解决方案,VS2013,x64机器。 Process.Start()无法通过.lnk文件启动应用程序。 使用进程资源管理器,似乎在.lnk文件中指定的目标不正确地解析为c:\ program files(x86)…而不是c:\ program files …我遵循Bruno的出色建议, Target已经标记为“AnyCPU”。
经过一番搔头之后,发现VS11 +中新增了一个名为“Prefer 32-bit”的编译器标志,默认情况下会被选中。 这是迫使EXE输出是32位,即使我的操作系统是64位和平台设置为AnyCPU。 我没有选中并重新编译后,问题就解决了。
更多阅读: http : //blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/
这实际上可能与您的情况无关,但您可以使用启动IIS管理器
Process.Start("inetmgr.exe")
如果要继续使用该快捷方式,则可能会使用ProcessStartInfo
启动进程并将ProcessStartInfo
设置为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线程:
为什么ShellExecute返回SE_ERR_ACCESSDENIED和ShellExecuteEx的一个可能的原因返回ERROR_ACCESS_DENIED
这是一个黑客,但尝试启动它是这样的:
string path = @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\IIS Manager.lnk"; Process.Start("cmd.exe", String.Format("/k \"\"{0}\"\"",path));
请注意保存路径中的空格所需的双引号。 这样,您可能会看到一个更精确的错误消息,或者在命令环境中四处走动,以查看路径出了什么问题。