在同一台计算机上安装开发版和生产版。

问题描述 投票:1回答:2

我有一个稳定的软件生产版本,它的版本号总是 "1.X.0"。我们没有任何测试环境,所以我创建了一个版本号为 "1.X.Y "的开发版本用于测试。在发布新的生产版本(1.X+1.0)之前,我在生产电脑上测试这个版本。

这样做很好,有安全措施,所以他们不会混在一起。我还为两个版本创建了自动更新,使用

startInfo.Arguments = string.Format("/passive /norestart /i \"{0}\"  TARGETDIR=\"{1}\"", msiPath, installDirectory);

installDirectory 是生产版和开发版的不同。

问题是这样的。

两个版本的升级代码是一样的。我不想在两个版本之间切换升级代码。我还将RemovePreviousVersion设置为false,因为我不想在安装1.X.Y版本时,将1.X.0版本删除。是否可以在同一台计算机上同时安装1.X.0和1.X.Y版本,当1.X.0版本升级到1.X+1.0版本时,只卸载1.X.0版本?1.X.Y版本也应如此。

还是有什么更好的处理方法呢,谢谢

c# wpf windows-installer desktop-application
2个回答
0
投票

我强烈建议使用虚拟机来测试软件的安装和升级。如果你有专业版或企业版的windows,你已经可以使用HyperV了。这有几个优点。

  • 你有一个已知的环境,无论是一个干净的windows安装,或结合您选择的软件。
  • 您可以轻松地将虚拟机恢复到以前的已知状态。
  • 你可以保留多个虚拟机或不同版本的快照。
  • 你可以用一种简单的方式测试不同的操作系统。
  • 你可以限制内存和处理器容量而不影响你的主工作站。
  • 你可以安装网络限制工具而不影响你的主工作站。

你仍然可以,也应该在自己的工作站上运行和测试软件的开发构建,因为这样可以简化调试。而虚拟机在做 "发布 "测试时更合适。


0
投票

我找到了同时安装2个或2个以上同一软件的不同版本并自动更新的解决方案。

首先我找到了我目前使用的版本,用

var version = Assembly.GetExecutingAssembly().GetName().Version;

然后,我将其与服务器上更新文件夹中的.msi文件版本进行比较(有生产和开发文件夹)。如果.msi版本比安装的版本高,升级就开始了。

首先,我将新软件安装在同一个文件夹中,使用的是

startInfo.Arguments = string.Format("/passive /norestart /i \"{0}\"  TARGETDIR=\"{1}\"", path, installDirectory);
var process = System.Diagnostics.Process.Start(startInfo);
process.WaitForExit();

然后,我只卸载了我打开的版本,我用下面的代码找到了那个特定版本的产品代码(我是在 Windows GUID或应用程序列表 答案,并稍作修改)

 private string GetProductCode(string programName, string version)
        {
            StringBuilder sbProductCode = new StringBuilder(39);
            int iIdx = 0;
            while (
                0 == MsiEnumProducts(iIdx++, sbProductCode))
            {
                Int32 productNameLen = 512;
                StringBuilder sbProductName = new StringBuilder(productNameLen);

                MsiGetProductInfo(sbProductCode.ToString(),
                    "ProductName", sbProductName, ref productNameLen);

                if (sbProductName.ToString().Contains(programName))
                {
                    Int32 installDirLen = 1024;
                    StringBuilder sbVersionString = new StringBuilder(installDirLen);

                    MsiGetProductInfo(sbProductCode.ToString(),
                        "VersionString", sbVersionString, ref installDirLen);

                    if (version.Contains(sbVersionString.ToString()))
                    {
                        return sbProductCode.ToString();
                    }
                }
            }

            return null;
        }

并运行

startInfo.Arguments = string.Format("/passive /norestart /x \"{0}\"", productCode);
System.Diagnostics.Process.Start(startInfo);

最后还是安装了2个版本的软件,只更新了一个。

© www.soinside.com 2019 - 2024. All rights reserved.