我正在用 C# 开发 WPF 应用程序。目前我的 msi 在机器上安装当前应用程序。我需要在安装新版本 (msi) 期间卸载现有版本的两个支持应用程序。
我编写了以编程方式卸载应用程序的代码,当我在 installer.cs
中调用应用程序卸载方法时,这不起作用。当我从 installer.cs
以外的项目的其他部分调用时,相同的方法成功卸载了两个应用程序。
卸载方法:
public static string GetUninstallCommandFor(string productDisplayName)
{
RegistryKey localMachine = Registry.LocalMachine;
string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products";
RegistryKey products = localMachine.OpenSubKey(productsRoot);
string[] productFolders = products.GetSubKeyNames();
foreach (string p in productFolders)
{
RegistryKey installProperties = products.OpenSubKey(p + @"\InstallProperties");
if (installProperties != null)
{
string displayName = (string)installProperties.GetValue("DisplayName");
if ((displayName != null) && (displayName.Contains(productDisplayName)))
{
string fileName = "MsiExec.exe";
string arguments = "/x{4F6C6BAE-EDDC-458B-A50F-8902DF730CED}";
ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true
};
Process process = Process.Start(psi);
process.WaitForExit();
return uninstallCommand;
}
}
}
return "";
}
更新:使用 WIX MSI 安装程序后
我在 WIX 中创建了 CustomAction 项目,还使用 WIX 创建了 Setup 项目。请参阅我的 Product.wxs
<InstallExecuteSequence>
<Custom Action='ShowCustomActionCustomAction' After='InstallFinalize'>NOT Installed</Custom>
</InstallExecuteSequence>
我有在 CustomAction.cs 中卸载 3 个应用程序的代码。当我运行我的 WIX MSI 时,它安装新应用程序并卸载第一个应用程序。其余两个应用程序没有卸载,我注意到成功卸载第一个应用程序后的 UI关闭,什么也没有发生。
你能告诉我如何在我的 WIX MSI 安装过程中卸载 3 应用程序吗?
更新 2:
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="89CF8BE7-05EE-4C7E-9EFC-0249DD260EBB">
<UpgradeVersion
Minimum="1.0.0.0" Maximum="99.0.0.0"
Property="PREVIOUSVERSIONSINSTALLED"
IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts Before="InstallFinalize" />
</InstallExecuteSequence>
</Product>
product.wxs 中的上述设置是卸载以前的版本并安装新版本。与此同时,我还需要卸载另外两个依赖应用程序。如何使用 wix 安装程序卸载依赖应用程序。
任何人都可以帮助我如何检查机器中已安装的应用程序并在安装我的新 wix msi 之前卸载它。
最佳答案
MSI 中有一个互斥锁可防止并发安装/卸载。一切都必须在单个安装程序的上下文中发生。也就是说,这样做的方法是将行创作到升级表中,以教 FindRelatedProducts 和 RemoveExistingProducts 删除额外安装的 MSI。
您没有提到您用于创建 MSI 的内容,因此我无法向您展示如何执行此操作。
您现在已经提到您正在使用 VDPROJ。此工具不支持创作您尝试执行的操作。我的建议是使用 Windows Installer XML (WiX) 进行重构并编写多个 Upgrade 元素以删除各种产品。
关于c# - 在安装过程中卸载应用程序不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26863294/