0

我添加了一些自定义逻辑来覆盖 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。所以显然它不起作用,因为旧版本不好。

多谢你们!

4

1 回答 1

0

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

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

于 2013-07-30T18:20:17.240 回答