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

本文关键字:ClickOnce 程序 启动 应用程序 另一个 | 更新日期: 2023-09-27 18:19:28

我的目标是实现一键(我想是两次)启动ClickOnce应用程序。该应用程序具有一些需要安装的先决条件。微软提供的确保安装它们的正常方法包括让用户决定他是否具备先决条件,下载并安装一个"setup.exe"来安装它们并运行ClickOnce应用程序。这包括下载EXE文件(单击一次),运行它(单击两次),然后在安装了先决条件后,再次单击以运行ClickOnce应用程序。

我试图将这个过程减少到一两次点击:-单击我的网站上指向ClickOnce .application文件的链接。-再次单击以运行它。

我制作了另一个ClickOnce应用程序,其中包括setup.exe。它检查是否安装了必备组件,如果安装了,它会自动运行另一个单击一次应用程序。如果没有,它将运行包含的setup.exe,然后运行其他ClickOnce应用程序。

我的问题是,当我尝试从这个应用程序运行另一个ClickOnce应用程序时,它只需打开我的web浏览器并下载.application文件,而不运行它。

我正试图使用以下内容从我的C#代码中启动ClickOnce应用程序:

Process.Start(ApplicationURL);

我只想让它在ApplicationURL上自动启动应用程序。有没有办法跳过我看到的浏览器参与?

(我的问题与Stack Overflow问题非常相似从网页运行ClickOnce应用程序而无需用户操作)。

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

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

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

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

  • 另一个堆栈溢出问题提到使用自定义.exe安装.NET Framework,然后通过ShOpenVerbApplication启动ClickOnce应用程序
  • Scott Hanselman在一篇关于Firefox和ClickOnce的文章中讨论了ShOpenVerbApplication作为application/x-ms-application MIME类型文件的默认文件映射

更新

正如另一个Stack Overflow问题所提到的,您也可以使用dfshim.dllLaunchApplication命令,该命令在Microsoft的网站上有文档记录。但是,该命令在某些较旧版本的.NET Framework中不可用。

查看有关通过InPlaceHostingManager手动安装的Microsoft演练。您可以通过编程进行自定义。

至少还有两种其他方法可以启动ClickOnce应用程序。

一个简单的方法是Process.Start("PresentationHost.exe", "-launchApplication " + ApplicationURL);,正如微软在这里记录的那样。

一个更复杂的方法是调用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导入和结构定义。此方法将查询注册表并运行"rundll32.exe dfshim.dll,ShOpenVerbApplication"(或在HKEY_CLASSES_ROOT''Application.Manifest下配置的任何其他程序)。

以下是启动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);

另一个选项是使用Launcher::LaunchUriAsync和LauncherOptions.ContentType="application/x-ms-application"。这被称为"uri直接调用"