WIX插件安装包的生成(二)软件自动更新

上一篇文章记录了如何生成最简应用程序安装包,一般来说做简单的应用相对够用,但是如果想实现自动更新,就要多花点功夫了。本篇介绍的是我所使用的一种基于局域网的公司内部插件更新,实现的方法呢也比较简单,主要分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改变才会覆盖源文件),因此如果将来不会有高频率修改的话不要介意这个问题。

猜你喜欢

转载自blog.csdn.net/dirichlet_zju/article/details/80150322
今日推荐