我的目标是实际实现一键启动我的ClickOnce应用程序(或者我猜两个)。该应用程序具有一些需要安装的先决条件。确保Microsoft安装它们的常规方法是让用户决定是否具有先决条件,并下载并安装“setup.exe”,安装它们并运行ClickOnce应用程序。这包括下载EXE文件(单击一下),运行它(两次单击),然后在安装先决条件后再次单击以运行ClickOnce应用程序。
我正在尝试将此过程减少为一次或两次点击:
- 点击我网站上的链接到ClickOnce .application
文件。
- 再次单击以运行它。
我制作了另一个ClickOnce应用程序,其中包含一个setup.exe。它会检查是否已安装先决条件,如果是,则会自动运行其他ClickOnce应用程序。如果没有,它将运行包含的setup.exe,然后运行另一个ClickOnce应用程序。
我的问题是,当我尝试从这个运行其他ClickOnce应用程序时,它只是打开我的Web浏览器并下载.application文件而不运行它。
我正在尝试使用以下内容从我的C#代码中启动ClickOnce应用程序:
Process.Start(ApplicationURL);
我只是想让它在ApplicationURL上自动启动应用程序。有没有办法跳过我看到的浏览器参与?
(我的问题非常类似于Stack Overflow问题 Run a ClickOnce application from a webpage without user action )。
答案 0 :(得分:17)
正如评论中所指出的,您可以启动iexplore.exe
进程来启动ClickOnce应用程序,而不依赖于默认浏览器。您也可以使用dfshim.dll
启动ClickOnce应用程序,方法与Windows资源管理器启动它一样。
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + ApplicationURL);
网上有一些其他文章讨论使用此策略,但我没有找到任何dfshim.dll,ShOpenVerbApplication的官方文档。
<强>更新强>
正如其他Stack Overflow问题所提到的那样,您也可以使用dfshim.dll
的{{1}}命令,documented on Microsoft's site。但是,该命令在某些旧版本的.NET Framework中不可用。
答案 1 :(得分:1)
通过Microsoft walkthrough手动查看InPlaceHostingManager进行手动安装。您可以通过编程方式进行自定义。
答案 2 :(得分:0)
还有至少两种其他方法可以启动ClickOnce应用程序。
一种简单的方法是Process.Start("PresentationHost.exe", "-launchApplication " + ApplicationURL);
,如Microsoft here所述。
更复杂的方法是使用如下代码调用ShellExecuteEx() Win32 API:
SHELLEXECUTEINFO info = new SHELLEXECUTEINFO();
info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(info);
info.lpFile = ApplicationURL;
info.nShow = SW_SHOWNORMAL;
info.fMask = SEE_MASK_CLASSNAME;
info.lpClass = "Application.Manifest";
ShellExecuteEx(ref info);
所需的Win32 API导入和结构定义可以在here中找到。此方法将查询注册表并运行“ rundll32.exe dfshim.dll,ShOpenVerbApplication”(或在 HKEY_CLASSES_ROOT \ Application.Manifest 下配置的任何其他文件)。
答案 3 :(得分:0)
以下是启动clickonce.application的方法
方法1:从URL启动
方法1:
string app = "http://domain.xyz/ClickOnce.application";
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + app);
方法2:
string app = "http://domain.xyz/ClickOnce.application";
Process.Start("IExplore.exe", app);
方法2:从.application文件直接启动ClickOnce.application
string app = "file://C:/ClickOnce.application";
Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + app);
答案 4 :(得分:0)
另一个选择是将Launcher::LaunchUriAsync与LauncherOptions.ContentType =“ application / x-ms-application”一起使用。这就是所谓的“ uri直接调用”