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