【问题标题】:MSI Uninstall Override logic fails, then I can’t uninstallMSI 卸载覆盖逻辑失败,然后我无法卸载
【发布时间】:2013-07-30 17:42:54
【问题描述】:

我添加了一些自定义逻辑来覆盖 MSI 的卸载方法。当我向我的卸载方法添加错误代码时,MSI 卸载炸弹。由于卸载被炸毁,我无法删除我的软件包并重试。所以 MSI 包安装正常,然后我尝试卸载,我看到我的方式错误,然后我无法卸载。

我有以下两个设置,它们似乎有效: DetectNewerInstalledVersion False RemovePreviousVersion True

我真的不需要显示代码,因为我知道它很糟糕,但它就是这样。基本上,如果有人将文件添加到此目录,我想在卸载时将它们炸毁。我也无法删除 InstallerClass.exe,因为它正在被使用。当卸载程序工作时,如果它是空的,则删除整个父目录。:

Public Overrides Sub Uninstall(savedState As System.Collections.IDictionary)

        Dim InstallerFileInfo As FileInfo = New FileInfo(Context.Parameters("assemblypath"))
        Dim InstallerDirectoryName As String = InstallerFileInfo.DirectoryName

        Dim ScriptsDirectory As String = (InstallerDirectoryName & "\Directory_to_be_Deleted")
        Dim InstallerClass As String = "InstallerClass.exe"

        If Directory.Exists(InstallerDirectoryName) Then
            For Each foundFile As String In My.Computer.FileSystem.GetFiles(InstallerDirectoryName)
                If (foundFile IsNot InstallerClass) Then
                    My.Computer.FileSystem.DeleteFile(foundFile, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.DeletePermanently)
                End If
            Next
        End If

        'MyBase.Uninstall(savedState)
 End Sub

我已经尝试了很多事情,例如升级版本和更改我的 xxVersion 开关,但我没有得到任何乐趣。

我很高兴知道“卸载之舞”的技巧,例如构建一个已知良好的版本、安装/卸载或找到一个较旧的已知良好并安装/卸载。

另外,我知道当您使用新的 MSI 卸载旧的 MSI 时,它尝试做的第一件事就是从旧版本中找到并使用 InstallerClass.exe。所以显然它不起作用,因为旧版本不好。

谢谢大家!

【问题讨论】:

    标签: vb.net windows-installer


    【解决方案1】:

    您必须在 Orca 中编辑 MSI 以禁用自定义操作(InstallExecuteSequence 表条件)并使用命令 msiexec /I foo.msi REINSTALLMOE=vomus REINSTALL=ALL /qb 重新缓存它。

    或者您可以只回复 VM 上的快照以退出安装。我猜你现在明白了,在你真正关心的机器上安装之前,应该对安装程序进行充分的测试。

    【讨论】:

    • 我有点惊讶 VS2010 没有像 Orca 这样的东西。但是好的,现在正在安装 Windows SDK。
    • 那是因为 Windows Installer 不是开发部门的技术。这是一种 Windows 平台技术。
    • 所以我有一个新的 MSI(没有错误的那个)但它不能卸载旧的包,我相信因为卸载设置在 InstallerClass.exe 中。它看起来不像 Orca 编辑 InstallerClass.exe。没有任何 MSI 从现有的 InstallerClass 中获取它的代码吗?在新的 MSI(有效的那个)中,我看到的与卸载有关的唯一属性是:_6D065175_37EA_49A1_B20F_89722E64EE17.uninstall.SetProperty
    • 啊,我编辑了原始的 MSI。现在我必须找到它... 编辑 - 不,我没有原始 MSI。
    • 转到 C:\Windows\Installer 并确定其中哪个 MSI 文件是您的产品。 FindStr -i -m SEARCHTEXT *.msi 很有帮助。使用 Orca 编辑该文件并跳过重新缓存步骤(这是缓存。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2012-11-12
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多