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



我有一个稳定的软件生产版本,它的版本号总是"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 或快照。
  • 您可以通过简单的方式测试不同的操作系统。
  • 您可以限制内存和处理器容量,而不会影响主工作站。
  • 您可以安装网络限制工具,而不会影响主工作站。

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

我找到了同时安装同一软件的 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 个已安装的 softare 版本,只有一个被更新。

最新更新