【问题标题】:Deploy my DLLs to GAC for use with ClickOnce App将我的 DLL 部署到 GAC 以与 ClickOnce 应用程序一起使用
【发布时间】:2010-11-09 03:43:34
【问题描述】:

我该怎么做?有什么理由我不应该吗?

我有一个 winform ClickOnce 应用程序,它的 DLL 中有大约 13mbs 不是我的,所以我不需要/没有能力定期更新它们。

DevExpress(3)、Microsoft ReportViewer、Microsoft SQL 复制。 Microsoft SQL SMO。

如果没有将它们包含在我的 ClickOnce 应用程序中,我的整个程序大约只有 1.5mbs,而且我们的远程站点的 vpn 连接有限,我真的需要把它下载下来。每次我对应用进行小的更改时,我都无法通过我们的网络向所有用户发送 15mbs。

谢谢


澄清更新

为了澄清;我不想使用 ClickOnce 将我的 DLL 安装到 GAC。 ClickOnce 是我的主要应用程序需要使用的。我想从 ClickOnce 应用程序中删除 13mbs 的 DLL 并安装它们以在所有本地系统上使用。

如果我能在没有 GAC 的情况下完成这项工作,那就太棒了。我只需要我的主应用修剪器以便更新。

【问题讨论】:

  • OK- 在更新之后,您知道 ClickOnce 不会为每次更新再次下载所有文件。它使用文件修补 - 请参见此处:msdn.microsoft.com/en-us/library/ms404267.aspx
  • 任何想法我做错了什么,因为每次我发布它都是 15mb 下载?

标签: .net winforms dll clickonce gac


【解决方案1】:

Clickonce 无法将文件安装到 GAC。您需要创建 MSI 或提升权限才能执行此操作。

一般而言,除非 GAC 解决了特定问题,否则您应该避开它。安装大小是否比 ClickOnce 下载更痛苦——用户使用的是 50K 调制解调器还是高速 LAN?

Chris Sells 有一篇很棒的文章,介绍了为什么应该 avoid the GAC,还有其他各种堆栈溢出帖子 - 请参阅 hereherehere

最终,您需要评估利弊,并决定什么是最佳行动方案。

【讨论】:

    【解决方案2】:

    根据谷歌nono here too.

    您将不得不研究替代安装工具,例如创建 MSI 安装程序。这听起来很奇怪,但我解决安装大小问题的第一个想法是拥有 两个安装程序。一个将依赖项安装到 GAC 中,用户只需运行一次,另一个安装程序(我猜可能使用 ClickOnce)安装实际应用程序。使用这种方法,理论上您可以依赖较小的 ClickOnce 部署来进行所有未来的应用更新。

    【讨论】:

      【解决方案3】:

      这是我过去所做的,对我来说效果很好。我让 ClickOnce 应用程序在 GAC 中查找其中一些依赖项。事实上,它会在每次应用程序加载时进行检查。我使用一个简单的文件来查看依赖项是否在 GAC 中。如果缺少依赖关系,我会显示一条消息,表明您缺少一些依赖关系以及有关如何修复它的一些说明。然后我掏出并下载一个自解压 exe,它在 GAC 中安装依赖项。它有点像 Rube Goldbergen,但对我来说效果非常好。

      我只会将在可预见的未来第 3 方控制等方面保持静态的内容放入 GAC。

      我有一个相当大的客户端,其中包括 MS Reporting、Infragistics 和 SMO 等,我们每周部署一个左右,大约 3.5MB。我们的许多用途都非常偏远,并且使用您可以通过互联网访问的数据卡。

      【讨论】:

      • 太棒了!您的情况听起来与我的非常相似,具有讽刺意味的是,您的解决方案与我今天在最初发布后开发的解决方案相似。我很好奇您如何让 ClickOnce 自动启动您的依赖项安装程序???您可以提供任何参考或方向吗?
      • 我所做的是使用自解压 exe 的路径作为参数调用 IE。 System.Diagnostics.Process myProcess = new System.Diagnostics.Process(); myProcess.StartInfo.FileName = "iexplore.exe"; myProcess.StartInfo.Arguments = "mycompany.com/gac.exe"; myProcess.Start();
      【解决方案4】:

      你怎么知道它是否每次都下载完整的 15 MB。 clickonce 对话框总是这样说,但它实际上并没有下载所有文件,只下载那些哈希在清单中发生变化的文件。 鉴于有办法从具有不同 URL 的 CD 部署以进行更新检查。这样您就可以第一次从 CD 安装,然后应用程序只能从您发布的网站更新自己。

      【讨论】:

      • 我想那时我不知道。您是说 ClickOnce 在更新期间报告的文件大小不准确?如果这是真的,那么关于如何判断实际转移的大小有什么想法吗?
      【解决方案5】:

      扩大@kanad 的回应...

      您的 13MB dll 只会在用户首次安装应用程序时下载。这是 ClickOnce 的一大优势,用户只需下载已更改的文件。

      然而,令人困惑的是,ClickOnce 进度对话框总是显示您的应用程序的整个大小,即使它可能没有下载整个应用程序。我进行了广泛的测试以确保情况确实如此,并使用带宽监视器向自己证明了这一点。

      最后,如果您可以控制您的网络服务器,您可能需要考虑为 ClickOnce 应用程序启用压缩。它有助于大大减少下载大小。压缩是一种痛苦的设置,但this article 应该让你开始。但是,再一次,压缩后的大小不会反映在 ClickOnce 进度对话框中。

      最好的办法就是忽略 ClickOnce 进度对话框中显示的数字 :)

      【讨论】:

        【解决方案6】:

        虽然其他答案是正确的,但 ClickOnce 只会下载一次 DLL(如果它们没有更改)来解决您的直接问题,如果您将在 ClickOnce 进程之外将 dll 安装到 GAC 中并且不想要要通过 ClickOnce 下载这些 DLL,您可以执行以下操作。

        通过在 ClickOnce->应用程序文件设置中将这些 DLL 设置为 prequisite,从 ClickOnce 下载中排除这些 DLL。

        执行此操作时,ClickOnce 运行时将在下载前检查 GAC 并确保这些 DLL 存在。

        【讨论】:

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