上一篇文章记录了如何生成最简应用程序安装包,一般来说做简单的应用相对够用,但是如果想实现自动更新,就要多花点功夫了。本篇介绍的是我所使用的一种基于局域网的公司内部插件更新,实现的方法呢也比较简单,主要分wix文件配置和cs文件修改两部分。
一、wix环境配置
<Upgrade Id="7a545a88-caad-43d6-ae74-4f5f9628f7e6">
<UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
Minimum="0.0.0.0" IncludeMinimum="yes"
Maximum="!(bind.assemblyVersion.tempAssembly)" IncludeMaximum="no" />
</Upgrade>
在Product部分插入这么一块内容(Upgrade),其中需要注意Upgrade的Id与Product的UpgradeCode相同,最大版本号Maximum绑定版本信息:bind.assemblyVersion.tempAssembly中:assemblyVersion项目表示版本文件“assemblyInfo.cs”中的
[assembly: AssemblyVersion("1.0.0.0")]
将其改为[assembly: AssemblyVersion("1.0.*")]
tempAssembly表示要绑定版本信息的文件File标签的Id,并将其Assembly值设置为“.net”,即:
<Component Id="ProductComponent">
<File Id="tempAssembly" Source="$(var.temp.TargetPath)" KeyPath="yes" Assembly=".net"/>
</Component>
之后,修改Product的Version同样为“!(bind.assemblyVersion.tempAssembly)”,这样我们就完成了Windows Installer XML文件的配置。
二、cs代码修改
这一部分主要分两块,一块是修改项目版本文件,刚才已经记录过了;另一部分是应用版本的识别并更新(与局域网内安装包版本进行对比)。
//Program中新建一个Update方法
static bool Update()
{
bool ret = false;
try
{
//安装包路径
string msifile = @"C:\MyDoc\C# practice\test\testUpdate\bin\Debug\testUpdate.msi";
//这部分主要是获取安装包版本信息,基本通用,注意导入WindowsInstaller才能使用
System.Type oType = System.Type.GetTypeFromProgID("WindowsInstaller.Installer");
Installer installer = System.Activator.CreateInstance(oType) as Installer;
Database DB = installer.OpenDatabase(msifile, MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly);
WindowsInstaller.View view = DB.OpenView("SELECT * FROM Property WHERE Property = 'ProductVersion'");
view.Execute();
WindowsInstaller.Record rec = view.Fetch();
string result = rec.get_StringData(2);//安装包版本
//现在运行程序的版本
FileVersionInfo oversion = FileVersionInfo.GetVersionInfo(System.Windows.Forms.Application.ExecutablePath);
if (oversion.FileVersion.CompareTo(result) < 0)
{
MessageBox.Show("已有新版本:" + result + ",确定更新!");
Process.Start(msifile);
ret = true;
}
}
catch (Exception)
{
MessageBox.Show("未找到版本信息");
}
return ret;
}
主程序中这样写
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (!Update())
{
Application.Run(new Form1());//你自己的程序
}
}
三、最后一步
由于我们使用了Assembly=”.net”,因此我们需要为附带版本信息的项目增设强名称才能对msi安装包进行安装。
解决方案管理器中选中项目,右键后选择“属性”
在签名处新建强名称秘钥文件即可。此时重新生成所有项目,主动生成一下wix项目,就能得到我们想要的安装包,之后重新编译生成安装包后,我们打开软件就能自动提示更新。
四、安装文件不覆盖的问题
调试阶段生成安装包频率很高,自动生成的版本号一般是以时间为单位产生的,所以如果时间间隔过近则版本号距离太近,从而不覆盖源文件(一般是A.B.C.D的话,至少要C改变才会覆盖源文件),因此如果将来不会有高频率修改的话不要介意这个问题。