【问题标题】:How do I run a custom action AFTER files have been deleted during MSI uninstallation?在 MSI 卸载期间删除文件后如何运行自定义操作?
【发布时间】:2009-06-08 14:24:25
【问题描述】:

在卸载我正在编写的 Visual Studio 集成包期间,我需要运行“devenv.exe /setup”来更新 VS UI 并从启动/帮助屏幕中删除包信息。

但是,它必须在删除所有加载项和软件包文件后运行。我当前的设置(使用在卸载步骤中调用的安装程序类自定义操作)导致 devenv.exe 在文件实际被删除之前运行得太早。这意味着启动画面信息不会更新。

有什么想法吗?我只需要 devenv 在安装结束时运行,不知何故 - 我不受自定义操作的约束。

【问题讨论】:

    标签: visual-studio windows-installer visual-studio-addins


    【解决方案1】:

    您可以将自定义操作编写为提交执行。这意味着它只会在成功卸载后运行。将其设置为 REMOVE="ALL" 以确保它仅在卸载时运行。

    【讨论】:

    • 这似乎不起作用。我已经在 Commit(安装)期间使用了我的 Installer 类,当它在回滚时运行时,它会在文件被删除之前运行。
    • “回滚”是什么意思?只有在安装过程中出现错误并且 MSI 必须撤消对系统所做的所有更改时才会发生回滚。这和卸载不一样——你说的是回滚还是卸载?
    【解决方案2】:

    事实证明,诀窍是使用 MS 的新部署工具基础将我的托管函数包装到非托管 DLL 中,完全避开 Installer 类。然后我使用 Orca(MSI 编辑器)在安装的特定时间添加自定义操作。

    Installer 类仅支持“延迟”自定义操作,这些操作必须在特定时间运行。

    【讨论】:

    • 是的,您应该添加延迟的自定义操作,并且可能就在 InstallFinalize 之前 - 这会结束在 InstallInitialize 开始的安装事务。系统更改应仅在此事务中进行,以便在发生错误时允许正确的系统回滚。确保您的自定义操作实际报告了准确的返回代码以指示成功或错误。如果必须,这将使设置回滚,或者如果一切正常,则完成。请勿在 InstallFinalize 之后添加更改系统的自定义操作,否则可能会导致 MSI 卸载失败。
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2018-06-15
    • 2017-11-01
    • 1970-01-01
    • 2013-02-14
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多