MSI卸载覆盖逻辑失败,然后我无法卸载

时间:2013-07-30 17:42:54

标签: vb.net windows-installer

我添加了一些自定义逻辑来覆盖MSI的Uninstall方法。当我向我的卸载方法添加错误代码时,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。显然它不起作用,因为旧版本很糟糕。

谢谢你们!

1 个答案:

答案 0 :(得分:0)

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

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