我有几个使用.NET Windows Forms编写的应用程序,我正在准备将它们转换为ClickOnce/智能客户端部署方案。我已经阅读过一些介绍,但我需要注意哪些问题或陷阱呢?
这里有几个小型应用程序会被间歇性地使用,但主要应用程序是用C#编写的,24/7运行,非常大,但每隔几周才进行更改。它还会在本地写入日志文件并与本地硬件设备交互。
我有几个使用.NET Windows Forms编写的应用程序,我正在准备将它们转换为ClickOnce/智能客户端部署方案。我已经阅读过一些介绍,但我需要注意哪些问题或陷阱呢?
这里有几个小型应用程序会被间歇性地使用,但主要应用程序是用C#编写的,24/7运行,非常大,但每隔几周才进行更改。它还会在本地写入日志文件并与本地硬件设备交互。
无法静默卸载ClickOnce部署的应用程序。此外,我认为不可能向启动快捷方式添加参数。
有很多事情是ClickOnce应用程序无法做到的,例如安装快捷方式到用户桌面或决定应用程序的安装位置。对于一些人来说,这些问题是不能接受的。
此外,虽然我已经有一段时间没有使用过它了,但是有一种特殊的方法可以确定和显示ClickOnce版本/构建号,这与应用程序的版本/构建号是分开的。您需要使用try/catch语句,如果ClickOnce版本/构建号引发异常,则表示该应用程序未作为ClickOnce部署应用程序运行(即从Visual Studio编译的常规应用程序)。
对于一个简单的应用程序(即不是Microsoft Word,而是一个快速且粗略的应用程序),并且需要频繁部署,ClickOnce非常适合。但是您会很快遇到"哦,ClickOnce无法完成这个操作,请选择MSI或其他东西"这样的限制。
我不知道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
}