如何以编程方式卸载 Windows 中的应用程序?
Posted
技术标签:
【中文标题】如何以编程方式卸载 Windows 中的应用程序?【英文标题】:How to programmatically uninstall an application in Windows? 【发布时间】:2011-04-24 17:59:50 【问题描述】:我们正在发布我们的应用程序的新版本,我们希望它能够从客户的计算机上卸载以前安装的版本。
我们怎样才能做到这一点?
编辑:我正在使用 Visual Studio 中的部署项目安装此应用程序(以及以前的版本),因此我假设它是 Windows Installer。
非常感谢!
【问题讨论】:
您使用的是什么安装技术? Windows 安装程序?国家情报局?还有什么? 您的应用程序是否已有卸载程序?您需要回滚什么类型的数据才能执行全新安装? @alastairs:见编辑 @Dennis:我没有卸载程序。基本上我应该删除整个程序文件文件夹以及我在用户的 AppData 配置文件中使用的一些其他文件夹。 【参考方案1】:Visual Studio 中的部署项目有一个内置功能可以删除应用程序的早期版本。
检查部署项目属性中的“RemovePreviousVersions”属性。
http://msdn.microsoft.com/library/y63fxdw6.aspx
编辑:
来自 MSDN:
安装程序会检查 UpgradeCode 和 ProductCode 属性确定 早期版本是否应该 删除。 UpgradeCode 必须是 两个版本相同;这 ProductCode 必须不同。
【讨论】:
如果这行得通,我会开枪给你一枚奖章。感谢您的回答,如果有效,我会告诉您!如何更新 UpgradeCode?span> 我不确定这个选项是否能达到你想要的效果。从提供的信息来看,这听起来像是第一次使用安装程序安装应用程序(否则,它会有一个可以运行的卸载程序)。 有什么方法可以在应用移除之前的版本之前触发一些方法? @Andrei:我混淆了 UpgradeCode 和 ProductCode。见编辑。 @Dennis:从 Andrei 的问题来看,之前的版本好像也是使用了 VS deployement 项目。 这些 GUID 属性是 Windows Installer 中整个升级过程的关键。应该严格遵守 MSDN 关于 UpgradeCode 和 ProductCode 的引用,否则您最终会遇到意外损坏的升级。【参考方案2】:如果您为您的版本使用批处理或其他自动部署工具,您可以使用以下命令行轻松卸载 MSI 产品:
msiexec [/卸载 | /x] [产品.msi |产品代码]【讨论】:
嘿詹姆斯。 +1 对于我想做的事情,但我也希望我的应用程序能够“获取”我的 ProductCode,而无需每次我进行软件更新时都必须进入并手动进行硬编码。知道该怎么做吗?【参考方案3】:Microsoft Installer (*.msi) 格式支持您想做的事情,不幸的是,Visual Studio 仅提供有限的自定义,并且旨在用于基本项目。
有很多关于这个主题的资源,还有很多其他人提出了类似的问题。我最好的建议是花一些时间研究 MSDN 文档。
...
更新
好的。在花了 30 分钟阅读了几篇文章之后,我认为可以使用与新安装程序打包的自定义操作。
在creating a Custom Action 上关注这篇 MSDN 文章。它包括创建一个新的类库,添加一个 System.Configuration.Install.Installer
类,将其作为输出添加到设置项目,然后然后将其选择为自定义操作。
要查看您的自定义操作选项卡,请右键单击设置项目并选择查看 > 自定义操作。
从这里开始:您需要编写代码来删除安装目录和 AppData 配置文件。这篇关于如何设置Custom Action Data 的文章可能会有所帮助。
祝你好运。
HTH,
丹尼斯
【讨论】:
感谢您的帮助丹尼斯。我确实为安装和卸载设置了自定义操作。问题是以前的版本没有设置相同的操作。删除安装目录不会卸载应用程序(就像从控制面板中一样)。 @Andrei:据我了解,您应该能够使用自定义操作来实现您想要的。检查安装目录是否存在,AppData配置文件是否存在,如果存在,删除它们。如果将任何键写入注册表,请找到它们并删除它们。这只是此版本的临时补丁,因为下次您将运行适当的卸载程序。也许您还应该研究您的应用程序结构并重新考虑您的部署选项。顺便说一句:你的安装基数有多大?【参考方案4】:如果您对此进行编程,那么这就是一个简单的反向批处理。 或者您可以使用一些安装程序/卸载程序构建器,例如 NSIS
【讨论】:
以上是关于如何以编程方式卸载 Windows 中的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章