代码之家  ›  专栏  ›  技术社区  ›  Steven A. Lowe

.NET中ClickOnce/smart client部署的陷阱/陷阱[已关闭]

  •  31
  • Steven A. Lowe  · 技术社区  · 16 年前

    我有几个.NET Windows Forms 我准备将其转换为 ClickOnce /智能客户端部署场景。我已经阅读了“这不是很好”的教程,但是有没有我应该注意的陷阱或“陷阱”?

    有几个小应用程序是断断续续使用的,但主要应用程序是C#语言,全天候运行,相当大,但仅每隔几周更改一次。它还本地写入日志文件并与本地硬件设备通信。

    11 回复  |  直到 11 年前
        1
  •  12
  •   Peter Mortensen Sumit Kumar    11 年前

    以下是我所知道的一些。

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

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

    3. 我需要跳转到另一台服务器,以将部署移动到另一台服务器。如果您在内部开发,并且用户可以看到您发布到的服务器,或者如果您部署到公共web,这不是一个问题,但是如果您需要独立地部署到多个客户站点,这不是一个好问题。

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

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

        2
  •  9
  •   Peter Mortensen Sumit Kumar    9 年前
    • 部署更新时,内置对话框将使其显示为整个应用程序正在重新下载。事实上,只下载更改的DLL,并且显示的进度条有误导性/错误。不要浪费时间试图弄清楚为什么重新部署所有程序集时却发现它们实际上不是。并不是我做了那件事。
    • 当您用来签署原始部署清单的证书过期并向您颁发一个新证书时,您将受到极大的伤害(客户端都需要卸载并重新安装)。细节 are at the horse's mouth .
        3
  •  7
  •   Community arnoo    7 年前

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

    此外,如果您没有使用最新版本的VisualStudio,您可以随时 write code to create a shortcut to the installed start menu shortcut .

        4
  •  6
  •   Chris Marasti-Georg Scott Weinstein    16 年前

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

        5
  •  4
  •   sindre j    16 年前

    无法以静默方式卸载ClickOnce部署的应用程序。此外,我认为不可能向启动快捷方式添加参数。

        6
  •  4
  •   Peter Mortensen Sumit Kumar    11 年前

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

        7
  •  3
  •   Peter Mortensen Sumit Kumar    11 年前

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

    桌面图标通过代码和前面提到的 3.5 SP1

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

        8
  •  3
  •   Peter Mortensen Sumit Kumar    9 年前

    有很多事情是ClickOnce应用程序无法完成的,比如安装用户桌面的快捷方式,或者在安装应用程序的地方安装任何sayso。对一些人来说,这些是交易破坏者。

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

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

        9
  •  3
  •   Peter Mortensen Sumit Kumar    9 年前

    与正常的.NET应用程序相比,您将拥有更少的系统访问权限。

    .NET Framework Developer's Guide: ClickOnce Deployment and Security

    我最大的问题是不可能用机器密钥加密配置文件的各个部分,因为您没有访问该密钥的权限(考虑到这一点,保护该密钥是有意义的)。

        10
  •  3
  •   Jimi    6 年前


    以下是我们一直以来的做法(现在称为“艰难之路”):

    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
    }
    
        11
  •  1
  •   Peter Mortensen Sumit Kumar    11 年前

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