我有一个稳定的软件生产版本,它的版本号总是 "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了。这有几个优点。
你仍然可以,也应该在自己的工作站上运行和测试软件的开发构建,因为这样可以简化调试。而虚拟机在做 "发布 "测试时更合适。
我找到了同时安装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个版本的软件,只更新了一个。