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

Installation of development and production versions on the same computer

我有一个稳定的软件生产版本,其版本号始终为“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 版本。

或者有更好的方法来处理这个问题吗? 谢谢

强烈推荐使用虚拟机来测试软件的安装和升级。如果您拥有 windows 的专业版或企业版,则您已经可以访问 HyperV。这有几个优点:

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

您仍然可以而且应该 运行 并在您自己的工作站上测试软件的开发版本,因为这可以简化调试。而 VM 在进行 "release" 测试时更合适。

我找到了同时安装同一软件的 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 or Application List 答案中找到了代码并对其进行了一些修改)

 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个安装版本的软件,只更新了一个。