我已经成功开发并部署了一个 ClickOnce 应用程序,它注册了一个关联的文件扩展名,例如*.abc
. 当我单击一个名为的文件x.abc
或x.abc
从命令提示符键入时,ClickOnce 应用程序将启动,我可以通过专用 API 检索该文件。我还可以使用以下代码以编程方式启动应用程序:
System.Diagnostics.Process.Start ("x.abc");
在我的 Windows Vista 64 位机器上一切正常。
但是,如果我尝试在 Windows 7(也是 64 位)上做同样的事情,我会遇到一个非常奇怪的问题。这是我观察到的:
x.abc
通过在资源管理器中双击它来手动启动。x.abc
从命令提示符手动启动有效。Process.Start("x.abc")
不启动应用程序;但是,返回的进程对象显示没有错误,并且 ClickOnce 应用程序以某种方式立即退出。但即使是Trace
在 ClickOnce 应用程序最开始的时候,也永远无法到达。- 更奇怪的是,包含单行
Process.Start("x.bat")
的文件也不会启动 ClickOnce 应用程序!同样从 Explorer 作品开始(当然)。x.bat
x.abc
x.bat
尝试分析发生的情况ProcMon
并不是很有帮助,因为在我看来,启动应用程序的 ClickOnce 过程很难遵循。我观察rundll32
开始工作,但没有任何失败的证据。
正在执行的程序Process.Start
是一个完全信任的控制台应用程序,没有什么花哨的。
我看不出在 Windows 7 上如何处理 ClickOnce 应用程序方面发生了什么变化,以及为什么Process.Start
不与从资源管理器启动文件完全相同。值得一提的是,使用更高级版本的Start
方法 withProcessStartInfo
和设置UseShellExecute
totrue
也无济于事。
从开始cmd
然后Process.Start
尝试启动x.abc
显示完全相同的问题。如果我将环境设置与cmd
手动启动进行比较,我会看到ProgramFiles
定义方式的差异(第一个指向C:\Program Files (x86)
而第二个指向C:\Program Files
)。从我的 .NET 应用程序启动的应用程序在 32 位仿真层 (SysWoW64) 上启动。
我能够x.abc
通过启动 32 位版本的命令提示符(即%windir%\SysWoW64\cmd.exe
)然后x.abc
在提示符处键入来重现启动失败。我还发现了一个丑陋的解决方法,即通过启动%windir%\Sysnative\cmd.exe /C x.abc
而不是x.abc
.
但我宁愿使用一种干净的方式来做这件事(或者让 Microsoft 代表告诉我这确实是 Windows 7 和/或 ClickOncce 的问题,并且很快就会修复)。