从另一个ClickOnce应用程序启动ClickOnce应用程序

时间:2012-01-05 15:21:47

标签: c# clickonce

我的目标是实际实现一键启动我的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 )。

5 个答案:

答案 0 :(得分:17)

正如评论中所指出的,您可以启动iexplore.exe进程来启动ClickOnce应用程序,而不依赖于默认浏览器。您也可以使用dfshim.dll启动ClickOnce应用程序,方法与Windows资源管理器启动它一样。

Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + ApplicationURL);

网上有一些其他文章讨论使用此策略,但我没有找到任何dfshim.dll,ShOpenVerbApplication的官方文档。

  • Another Stack Overflow question提到使用自定义.exe来安装.NET Framework,然后通过ShOpenVerbApplication启动ClickOnce应用程序。
  • Scott Hanselman discusses ShOpenVerbApplication,作为关于Firefox和ClickOnce的帖子中具有application / x-ms-application MIME类型的文件的默认文件映射。

<强>更新

正如其他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直接调用”