【问题标题】:Pitfalls/gotchas of ClickOnce/smart-client deployment in .NET [closed].NET 中 ClickOnce/智能客户端部署的陷阱/陷阱 [关闭]
【发布时间】:2010-09-14 01:32:50
【问题描述】:

我有几个 .NET Windows Forms 应用程序,我正准备将它们转换为 ClickOnce/smart-client 部署方案。我已经阅读了这不是很好的教程,但是我应该注意哪些陷阱或“陷阱”?

有几个小应用程序断断续续地使用,但主要应用程序是 C#,24/7 运行,相当大,但每隔几周才会更改一次。它还会在本地写入日志文件并与本地硬件设备通信。

【问题讨论】:

  • 因“不具建设性”而关闭 - 但是这个问题的答案对我非常有帮助...决定不使用 ClickOnce 部署 ;)
  • 我看到很多人抱怨 clickonce,从那以后情况发生了变化,不要让这些答案吓倒你,它易于设置且具有良好的优势

标签: .net winforms clickonce smartclient


【解决方案1】:

这里有一些我知道的。

  1. 无法在桌面上放置图标。现在可以了。

  2. 我无法为所有用户安装。

  3. 我需要跳过障碍将部署移动到不同的服务器。如果您在内部开发,用户可以看到您发布到的服务器,或者如果您正在部署到公共 Web,这不是问题,但如果您需要独立部署到多个客户站点,那就不是很好了。

  4. .NET 3.5 SP1 开始,您不再需要签署部署清单,这使得将部署迁移到新服务器变得更加容易。

  5. 我无法在 GAC 中安装程序集。您可以通过创建作为 ClickOnce 应用程序先决条件的常规安装包来解决此问题。

【讨论】:

  • 除非您使用 .NET 3.5 SP1,否则无法更改过期的签名密钥(无需重新安装)。
  • 实际上,您只需使用新的更新 URL 发布它就可以将其移动到不同的服务器(请参阅robindotnet.wordpress.com/2010/01/17/…)。您可以在 GAC 中安装程序集,方法是将它们放入安装和部署包中,并将它们作为先决条件进行部署。
  • @RobinDotNet 从我们的构建环境直接发布到多个客户的内部服务器并不容易。无论如何,.net3.5 sp1 通过删除签名要求解决了我所有的问题。
  • @RobinDotNet 用户是否需要管理员权限才能安装先决条件?
  • 是的,用户确实需要管理员权限才能安装先决条件
【解决方案2】:
  • 部署更新后,内置对话框将使其看起来好像正在重新下载整个应用程序。实际上,只有更改的 DLL 正在下载,并且显示的进度条具有误导性/错误。不要浪费时间试图弄清楚为什么要重新部署所有程序集,结果却发现它们实际上并非如此。不是我那样做或任何事情。
  • 当您用于签署原始部署清单的证书到期并为您颁发了新证书时,您将陷入困境(客户端都需要卸载并重新安装)。详情are at the horse's mouth

【讨论】:

    【解决方案3】:

    大多数问题已得到解决,但有几个人提到无法创建桌面快捷方式。其实你can create a desktop shortcut with Visual Studio 2008 SP1

    另外,如果您使用的不是最新版本的 Visual Studio,您可以随时write code to create a shortcut to the installed start menu shortcut

    【讨论】:

    • 虽然很遗憾,它不会被完全卸载。
    【解决方案4】:

    我们有一个要部署为 ClickOnce 应用的应用。我们需要用户能够修改安装中的一些设置(例如部署路径 - IT 希望从他们的网络共享中提供文件,在构建时未知)。当您更改部署中的任何文件时,您需要重新计算所有哈希值,并对所有内容重新签名。因此,如果此解决方案是内部解决方案,您可能不会在传递签名证书时遇到问题,但如果这是针对客户的,您将需要构建一个奇特的解决方案来绕过此问题。

    我从互联网的某个地方听到传言说,未来版本的 ClickOnce 将消除一些令人头疼的问题。

    【讨论】:

    • 我希望你听到的传言是正确的......这对我们来说是一个大问题!
    【解决方案5】:

    您不能静默卸载 ClickOnce 部署的应用程序。另外我认为启动快捷方式不能加参数。

    【讨论】:

      【解决方案6】:

      ClickOnce 的一个缺陷是您无法安装到GAC。如果您想安装多个共享 DLL 文件的应用程序,这是一个问题。每个应用程序都需要 DLL 文件的本地副本。此外,多个用户安装已结束。见the list comparing Window Installer to ClickOnce

      【讨论】:

      • 如果 dll 是强命名的,ClickOnce 会缓存它们。因此,如果您有多个使用相同 dll 的应用程序(我们有多个,包括 log4net),ClickOnce 只会在缓存中保留一份副本。
      【解决方案7】:

      如果有人在搜索中提及此内容,我们发现许多客户担心“分发”他们的应用程序缺乏安全性。该应用程序必须在公共位置可用 - 无需任何身份验证 - 才能检查更新。唯一的例外是如果您有 Windows NT 身份验证。我认为 Securing ClickOnce Applications 解释了我的意思。

      桌面图标通过代码实现起来相当简单,并且如前所述,使用 3.5 SP1 已内置 - 所以这不再是问题。

      xmlSerializer 仍有一个未修复的错误 - 在某些情况下它没有正确部署。一个简单的解决方法是手动将此文件添加到部署中。 PITA,但它很容易......但是,当您的部署突然失败时,这可能会令人震惊......

      【讨论】:

        【解决方案8】:

        您无法使用 ClickOnce 应用程序做很多事情,例如安装用户桌面的快捷方式或在安装应用程序的位置设置任何sayo。对于某些人来说,这些都是破坏交易的行为。

        我也已经有一段时间没有使用它了,但是您可以使用一种特殊的方法来计算和显示 ClickOnce 版本/内部版本号,它与应用程序的版本/内部版本号是分开的。您必须尝试/捕获,如果 ClickOnce 版本/内部版本号引发异常,则该应用程序未作为 ClickOnce 部署的应用程序运行(即,它作为定期编译的应用程序或从 Visual Studio 运行)。

        对于一个简单的应用程序(即不是Microsoft Word,而是一个快速而肮脏的应用程序来做某事)并且需要大量定期部署,ClickOnce 非常棒。但是你很快就遇到了“哦,ClickOnce不能做到这一点,请选择MSI或其他)。

        【讨论】:

        • 在尝试获取部署的版本号时不要使用 Try/Catch,而是将其包装在“If System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed Then ...”中干净多了。如果是网络部署的,您可以获得版本。如果没有,你不能。简单易懂:)
        【解决方案9】:

        您将拥有比普通 .NET 应用程序更少的系统访问权限。

        那是因为您将获得较低的信任级别。 .NET Framework Developer's Guide: ClickOnce Deployment and Security 了解更多信息。

        我最大的问题是无法使用机器密钥加密配置文件的某些部分,因为您无权访问该密钥(考虑到保护该密钥是有意义的) .

        【讨论】:

        • 嗯,不确定...您可以请求更高的信任级别,用户可能只会收到一个警告对话框。您可以在第一次运行时在代码中加密配置文件的各个部分,但不能在部署期间加密,因为这是部署机器的密钥,而不是客户端的密钥,客户端无法读取。
        • 正确,但要解密它,您总是必须拥有更高的信任级别....
        【解决方案10】:

        我不知道 SP1 允许您创建桌面图标。
        以下是我们一直在做的事情(现在被称为“艰难的方式”):

        try
        {
            string company = string.Empty;
            string product = string.Empty;
            if (Attribute.IsDefined(asm, typeof(AssemblyCompanyAttribute)))
            {
                AssemblyCompanyAttribute asCompany = (AssemblyCompanyAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyCompanyAttribute));
                company = asCompany.Company;
            }
            if (Attribute.IsDefined(asm, typeof(AssemblyProductAttribute)))
            {
                AssemblyProductAttribute asProduct = (AssemblyProductAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyProductAttribute));
                product = asProduct.Product;
            }
            if (!string.IsNullOrEmpty(company) && !string.IsNullOrEmpty(product))
            {
                string desktopPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                    product + ".appref-ms");
                string shortcutPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs),
                    Path.Combine(company, product + ".appref-ms"));
                File.Copy(shortcutPath, desktopPath, true);
            }
        }
        catch 
        {
            // Shortcut could not be created
        }
        

        【讨论】:

        • SP1 的什么? .NET 3.5?
        【解决方案11】:

        如果客户端位于需要身份验证的代理后面,则无法安装。

        【讨论】:

        • 是的,你可以。有一个解决方法。看看这个帖子的结尾:social.msdn.microsoft.com/Forums/en/winformssetup/thread/…
        • 嗨罗宾,如果你指的是你自己的帖子 - 那仅限于升级,不是吗?我的评论是关于初始安装,您自己说您必须通过 USB/CD 等使用此解决方法进行安装。实际上,前几天我在处理这个问题时偶然发现了那篇文章,并暂时为解决方案感到兴奋。但是对于像我们这样的互联网部署应用程序 (qiqqa.com) 不幸的是,它并没有真正的帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-19
        • 2010-10-22
        • 1970-01-01
        相关资源
        最近更新 更多