我有几个 .NET Windows 窗体应用程序,我正准备将它们转换为ClickOnce /smart-client 部署方案。我已经阅读了这不是很好的教程,但是我应该注意哪些陷阱或“陷阱”?
有几个小应用程序断断续续地使用,但主要应用程序是 C#,24/7 运行,相当大,但每隔几周才会更改一次。它还本地写入日志文件并与本地硬件设备对话。
我有几个 .NET Windows 窗体应用程序,我正准备将它们转换为ClickOnce /smart-client 部署方案。我已经阅读了这不是很好的教程,但是我应该注意哪些陷阱或“陷阱”?
有几个小应用程序断断续续地使用,但主要应用程序是 C#,24/7 运行,相当大,但每隔几周才会更改一次。它还本地写入日志文件并与本地硬件设备对话。
大多数问题已得到解决,但有几个人提到无法创建桌面快捷方式。事实上,您可以使用 Visual Studio 2008 SP1 创建桌面快捷方式。
此外,如果您使用的不是最新版本的 Visual Studio,您始终可以编写代码来创建已安装的开始菜单快捷方式的快捷方式。
我们有一个要部署为 ClickOnce 应用程序的应用程序。我们需要用户能够修改安装中的一些设置(例如部署路径 - IT 希望从他们的网络共享中提供文件,在构建时未知)。当您更改部署中的任何文件时,您需要重新计算所有哈希值,并对所有内容重新签名。因此,如果此解决方案是内部解决方案,您可能不会在传递签名证书时遇到问题,但如果这是针对客户的,您将需要构建一个奇特的解决方案来绕过此问题。
我从互联网内部的某个地方听到传言说,未来版本的 ClickOnce 将消除一些这种令人头疼的问题。
ClickOnce 的缺陷之一是您无法安装到GAC。如果您想安装多个共享 DLL 文件的应用程序,这是一个问题。每个应用程序都需要 DLL 文件的本地副本。此外,多个用户安装已结束。请参阅比较 Window Installer 和 ClickOnce 的列表。
您不能静默卸载 ClickOnce 部署的应用程序。另外我认为在启动快捷方式中添加参数是不可能的。
您无法使用 ClickOnce 应用程序做很多事情,例如安装到用户桌面的快捷方式或在安装应用程序的位置设置任何sayo。对于某些人来说,这些是破坏交易的人。
自从我使用它已经有一段时间了,但是有一种特殊的方法可以用来计算和显示 ClickOnce 版本/内部版本号,它与应用程序的版本/内部版本号是分开的。您必须尝试/捕获,如果 ClickOnce 版本/内部版本号引发异常,则该应用程序未作为 ClickOnce 部署的应用程序运行(即,它作为定期编译的应用程序或从 Visual Studio 运行)。
对于一个简单的应用程序(即不是Microsoft Word,而是一个快速而肮脏的应用程序来做某事)并且需要大量定期部署,ClickOnce 非常棒。但是您很快就遇到了“哦,ClickOnce无法做到这一点,请选择MSI或其他)的墙。
与普通的 .NET 应用程序相比,您将拥有更少的系统访问权限。
那是因为您将获得较低的信任级别。.NET Framework 开发人员指南:ClickOnce 部署和安全性中的更多信息。
我最大的问题是无法使用机器密钥加密配置文件的某些部分,因为您无权访问该密钥(考虑到保护该密钥是有意义的)。
如果有人在搜索中提到这个,我们发现许多客户担心“分发”他们的应用程序缺乏安全性。该应用程序必须在公共位置可用 - 无需任何身份验证 - 才能检查更新。唯一的例外是如果您有 Windows NT 身份验证。我认为保护 ClickOnce 应用程序可以解释我的意思。
桌面图标通过代码来完成是相当简单的,并且如前所述,在3.5 SP1中,已经嵌入 - 所以这不再是一个问题。
xmlSerializer 仍有一个未修复的错误 - 在某些情况下它没有正确部署。一个简单的解决方法是手动将此文件添加到部署中。PITA,但它很容易......但是,当您的部署突然失败时,这可能会令人震惊......
我不知道 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
}
如果客户端位于需要身份验证的代理后面,则无法安装。