【问题标题】:Installation of development and production versions on the same computer在同一台计算机上安装开发和生产版本
【发布时间】:2020-06-16 11:02:12
【问题描述】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。我一定会检查 VM 以进行测试安装。
【解决方案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 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个安装的软件版本,只更新了一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多