在同一台计算机上安装开发版和生产版
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个安装版本的软件,只更新了一个。
我有一个稳定的软件生产版本,其版本号始终为“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个安装版本的软件,只更新了一个。