Я нашел решение для одновременной установки 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();
Затем я удаляю только ту версию, которую я открыл. Я нахожу код продукта этой версии c, используя приведенный ниже код (я нашел код в ответе Windows GUID или 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 установленных версии софта и обновилась только одна.