【问题标题】:Launching a ClickOnce application from another ClickOnce application从另一个 ClickOnce 应用程序启动 ClickOnce 应用程序
【发布时间】:2012-02-03 10:05:36
【问题描述】:

我的目标是真正实现一键启动我的 ClickOnce 应用程序(或者我猜是两次)。该应用程序有一些需要安装的先决条件。 Microsoft 提供的确保安装它们的正常方法包括让用户决定他是否具有先决条件,然后下载和安装“setup.exe”,该“setup.exe”会安装它们并运行 ClickOnce 应用程序。这包括下载 EXE 文件(单击一次)、运行它(单击两次),然后在安装必备组件后,再次单击以运行 ClickOnce 应用程序。

我正在尝试将此过程减少到一两次点击: - 单击我网站上指向 ClickOnce .application 文件的链接。 - 再次点击运行。

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

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

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

Process.Start(ApplicationURL);

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

(我的问题与 Stack Overflow 问题非常相似Run a ClickOnce application from a webpage without user action)。

【问题讨论】:

  • 您的默认浏览器是什么?你试过了吗:Process.Start("iexplore.exe", ApplicationURL)
  • 好的,我刚刚找到了我自己问题的答案。问题是我的默认浏览器是 google chrome,它不太了解如何处理 clickOnce 应用程序。我将代码更改为: ProcessStartInfo startInfo = new ProcessStartInfo("Iexplore"); startInfo.Arguments = 应用程序 URL; Process agentStudio = Process.Start(startInfo);现在它使用 Internet Explorer 启动应用程序,并且该应用程序现在真的可以作为“一键式”应用程序运行。
  • 感谢 M. Babcock,在您回复时独立发现!
  • 如果您要做的只是设置文件名和参数,则无需实例化ProcessStartInfo 对象。这就是 Process.Start(string, string) 重载的用途。
  • 你的路径是什么样的?我可以通过使用Process.Start(<path to .application file>); 从另一个应用程序启动一个 ClickOnce 应用程序。那就是使用 UNC 路径 (\\server\share\folder\program.application)

标签: c# clickonce


【解决方案1】:

正如 cmets 中所指出的,您可以启动 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.dllLaunchApplication 命令,即documented on Microsoft's site。但是,该命令在某些旧版本的 .NET Framework 中不可用。

【讨论】:

  • 这些很好用,但是我怎样才能通过身份验证呢? SSRS 站点需要一个,如果没有凭据,应用程序下载将失败。我正在尝试结合使用 InPlaceHostingManager(我已经知道,给@dgp +1)和隐藏的嵌入式 Web 浏览器控件,但它看起来很难看。
【解决方案2】:

查看Microsoft walkthrough 以通过InPlaceHostingManager 手动安装。您可以以编程方式进行自定义。

【讨论】:

  • 安装应用程序的绝佳解决方案,但无法“启动”应用程序。来自文档:“InPlaceHostingManager 可以安装 ClickOnce 应用程序,但无法执行它。此类中的某些方法(例如 Execute)保留用于下载在 Web 浏览器中运行的基于 Windows Presentation Foundation 的应用程序时使用。” dfshim 方法允许安装和启动。
【解决方案3】:

至少有 2 种其他方法可以启动 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);

可以在here 找到所需的 Win32 API 导入和结构定义。此方法将查询注册表并运行“rundll32.exe dfshim.dll,ShOpenVerbApplication”(或在 HKEY_CLASSES_ROOT\Application.Manifest 下配置的任何其他内容)。

【讨论】:

    【解决方案4】:

    以下是启动 clickonce.application 的方法

    方法一:从 URL 启动

    方法一:

    string app = "http://domain.xyz/ClickOnce.application";
    Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + app);
    

    方法二:

    string app = "http://domain.xyz/ClickOnce.application";
    Process.Start("IExplore.exe", app);
    

    方法二:直接从.application文件启动ClickOnce.application

    string app = "file://C:/ClickOnce.application";
    Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " + app);
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多