我已经使用VS2010设置项目构建了MSI安装程序。

现在,由于“ 1001例外:参数MachineName的无效格式”(请参见下文),因此该项目不会删除。

我使用从系统控件中的删除或 msiexec /uninstall.

有没有办法强制卸载?

细节:

作为自定义操作的一部分,我注册了一个自定义事件源,我的应用程序用于将其用于浮动到Windows日志的事件:

public override void Install(IDictionary stateSaver) {  
        base.Install(stateSaver);  
        EventLog.CreateEventSource("VeodinRecorder","Application");  
}  

在“卸载”的内部,我尝试使用此eventsource

if (!EventLog.SourceExists("VeodinRecorder"))  
   EventLog.Delete("VeodinRecorder"); `

EventLog.delete还将MachineName作为第二个参数,因此我尝试覆盖用于卸载的MSI msiexec /fv 并改变了卸载动作:

   EventLog.Delete("VeodinRecorder","."); 
   EventLog.Delete("VeodinRecorder","Application"); 

我什至把整个“卸载动作”留给了空白。

但是似乎没有任何作用。

有提示吗?

完整日志:

错误1001.错误1001.卸载时发生异常。该例外将被忽略,卸载将继续。但是,卸载完成后,该应用程序可能不会完全卸载。 - >参数MachineName的无效格式。 MSI(S)(60!68)[22:49:00:101]:
调试:错误2769:自定义操作_3C1D0358_8969_4B01_B8FA_B6B43F4F4E9E4C.UNINSTALL没有关闭1个MSIHANDLES。
安装程序遇到了安装此软件包的意外错误。这可能表明此软件包的问题。错误代码为2769。参数为:_3C1D0358_8969_4B01_B8FA_B6B6B43F43F43F4E9E9E4C.UNINSTALL,1,自定义_3C1D0358_8969969_4B01_4B01_B8FA_B8FA_B6B43F43F43F43F43F43F43E9E4C.UNINSTALL IFER STRACTAL INDALL IFER STRACTAL INDALL IFER STRACTAL INDALL IFER STRACTAL INDALL IFER SERATION BEANENS 3
动作结束了22:49:00:Installexecute。返回值3。
动作结束了22:49:00:安装。返回值3。

有帮助吗?

解决方案

当我更新安装时,似乎没有更新customAction.dll msiexec /fv.

现在,我将新构建的customaction.dll(带有空的卸载覆盖)手动将其放入安装文件夹中,并能够卸载。

更新: (信用@pcans)使用Orca编辑当前安装的MSI并手动禁用卸载自定义操作。

其他提示

只是 以供参考 我想补充一点你也可以 修补已安装的产品轻微升级 在调用卸载序列中,请在卸载序列中删除任何错误的动作。之所以起作用,是因为较小的升级是同一产品的重新安装,而不是卸载和重新安装新版本(这是主要升级)。因此,您在运行错误的一个序列之前,将卸载序列替换为正确的序列。

但是,即使使用Wise或InstallShield等专业工具,创建补丁也很复杂,但是在某些情况下,这是唯一可以正确卸载包装的修复程序。应该以这种方式修复“公司中的“在野外”中的包裹。

最后你可以使用 msizap.exe 从微软到从Windows Installer数据库中删除整个错误的软件包,但这不是很好,因为对系统的更改根本没有回滚,并且到处都有很多垃圾。该工具本身有时似乎也有些动摇,有时会产生真正难以解决的新错误。最好将其用于 仅调试.

在这个已经很长的答复中的另一个注释: 特例 是当您仅在卸载序列期间运行自定义操作时,然后返回错误的返回代码 - 有时即使它执行其操作确定也可以。这些动作会引发非常刺激的纽带”卸载仅回滚情况“实际上,当您的卸载量击中在安装过程中从未运行的自定义操作时,您的卸载都会回滚。这将滚动卸载,因此可以作为安装工作 - 您的产品留在机器上。非常奇怪。

底线: :跳过卸载过程中运行的自定义操作的返回代码,请使用其他验证机制来确保动作成功。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top