【问题标题】:VS2017 Installer Project - Cannot Make UninstallerVS2017 安装程序项目 - 无法制作卸载程序
【发布时间】:2018-02-19 23:53:28
【问题描述】:

我已经能够使用 Visual Studio Community 2017 上的安装程序项目成功安装一个简单的程序。但是,我不知道如何为最终用户创建一个完全工作的可部署卸载程序。

安装程序项目设置为仅使用 Program .exe 创建一个应用程序文件夹(在 C:\Program Files... 中),没有其他内容。它成功地做到了这一点。我想要一个安装程序,因为以后我打算在安装时制作一些注册表项。

为了测试卸载,我使用“卸载”选项运行安装程序项目构建的原始 .exe 文件。这会删除应用程序文件夹,但不会从 Windows 的“添加/删除程序”列表中删除该程序 - 让我相信还有其他注册表项尚未删除。

我尝试完全从“添加/删除程序”列表中卸载,但随后出现错误: C:\WINDOWS\system32\msiexec.exe “Windows 无法访问指定的设备、路径或文件。您可能没有访问该项目的适当权限。”

在 Visual Studio 中,我可以从安装程序项目右键单击菜单中单击“卸载”,这确实成功删除了应用程序文件夹和添加/删除程序项,但这不是可部署的解决方案。

注意事项: 操作系统:Windows 10 使用 Visual Studio 2017 社区 查看应用程序文件夹,其中既没有安装也没有卸载 .exe 文件。安装程序项目 .exe 仅位于原始构建位置,我无法找到如何在应用程序文件夹中获取副本(不确定那里的副本是否有效)。 我尝试将安装程序项目配置为 x86 和 x64,没有任何变化。 我已尝试同时使用 Debug 和 Release 构建配置,没有任何变化。

环顾四周,WiX 似乎具有更多功能和灵活性,但我还没有深入研究。有更简单的解决方案吗? 有没有其他人遇到过这个问题?我希望安装程序项目是学习和处理安装的简单方法。

【问题讨论】:

  • 95% 确定这是设计使然,Windows 期望用户通过添加/删除程序小程序激活卸载程序,并且在手动启动安装程序时没有给予足够的关注。

标签: visual-studio-2017 windows-installer installation visual-studio-setup-proje


【解决方案1】:

看起来我在上面的评论中得出了结论,但我认为我发现了问题:我无法从系统设置中的 Windows 应用程序和功能窗口卸载程序,但从控制面板\程序\程序和功能卸载有效很好。

当使用 Windows 开始按钮输入“删除”时,出现的默认项目是系统设置中的“添加或删除程序”(这看起来像 Windows 10 的东西)。当您单击它时,它会将您转发到“应用程序和功能”窗口。我现在了解到,由于某种原因,它具有与控制面板窗口不同的功能。或者它可能具有较低的权限,尽管我是管理员和唯一的用户这台电脑……

因为它可以从控制面板中卸载,我认为这是首选的解决方案。我对系统设置中另一个窗口的假设是我真正的问题。我只是希望“应用程序和功能”窗口将其功能/权限与控制面板对齐。

我还了解到,当我在 cmd 中运行 msiexec.ex /I{PACKAGEID} 时卸载成功。不确定这有多相关,但在此处记录。

【讨论】:

  • 语法是 msiexec /x {productcode} 不是打包代码。
【解决方案2】:

安装和卸载是事务性的,它们要么完全工作,要么完全回滚。如果您进行了卸载,但该条目仍保留在“添加/删除程序”中,则该卸载实际上可能不起作用。

当您进行安装时,如果它有一个 UAC 提升对话框,那么安装将使用提升运行,并将文件/注册表条目安装到限制用户禁止使用的位置。从这些位置删除文件也需要提升。您还没有确切说明您的卸载是如何工作的,但很可能它需要提升才能成功,并且您的程序没有运行提升。如果您的程序静默卸载,则卸载将静默失败,因此您的程序可能实际上并未检查卸载是否有效。

我还猜测您的 Visual Studio 会话可能正在运行提升,因此从那里卸载可以正常工作。

除了特权之外,从正在运行的已安装程序卸载往往效果不佳,因为卸载过程无法删除正在运行的程序或其文件夹,因为它正在使用中。因此,虽然您可以让它工作(使用提升),但您可能会发现您的程序及其文件夹被留在后面,直到下次重新启动。如果人们真的想这样做,其中一种策略是将卸载程序复制到临时文件夹并异步启动它,这样就可以删除所有内容。

从添加/删除程序和功能卸载通常可以正常工作。如果没有某些上下文,该错误消息并没有多大意义。这不是来自 Windows Installer 的消息,因此它可能来自自定义操作。否则,它可能是特定于测试机器的问题。

Windows Installer 安装程序中从来没有卸载 exe。当您删除产品时,系统只需调用 Windows API 即可删除该产品。 Windows Installer 是 Windows 操作系统的一部分,为所有需要做的事情提供 API 支持。只有非 MSI 设置需要安装和卸载 exe 才能执行任何操作。

这些问题似乎都与您选择的工具无关。他们都创建 MSI 文件,如果 MSI 设计不是最佳的,那么您使用什么工具都没有关系。 WiX 并没有什么问题,但是与 Visual Studio 相比,要安装几个文件就有点过分了。

【讨论】:

  • 感谢您的详细回复!我可能已经找到了答案:正如您提到的,非 msi 设置需要安装和卸载程序,而 msi 设置使用 Windows API 来处理这个问题。好吧,我意识到Installer项目有两个文件,一个exe和一个msi,我一直在点击exe。当我使用提升的权限从 msi 安装和卸载时,一切都按预期工作。再次感谢您的指导。
猜你喜欢
  • 1970-01-01
  • 2014-10-08
  • 2019-12-13
  • 1970-01-01
  • 2021-12-26
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
相关资源
最近更新 更多