2009-10-14 77 views
5

我已将基于WiX的安装程序混淆在多台服务器上,以便在卸载过程中不再删除文件或组件(或甚至其他功能)。 MSI日志显示所有不会卸载的组件上的PreviouslyPinned = 1。删除与WiX一起安装的GUID =“”组件

我不喜欢使用SharedDll计数甚至不同安装程序之间的共享组件。

我想我已经追踪到我的WiX代码的特定版本。我做了几件愚蠢的事情。我(无意)创建的非托管组件用空的Guid

<Component Id="file.ext" Guid=""> 
    <File .../> 
<Component> 

,我也改变了其他组件的文件位置和Id(但不包括它的GUID)。先前版本中的所有组件显示BeforelyPinned = 1,并且不会卸载,并且在此版本之后添加的新组件正确安装/卸载。

如何让我的安装程序恢复正常并删除以前固定的组件?

回答

5

Windows Installer实际上支持空白GUID的概念。它表示“安装,但不注册组件”:http://msdn.microsoft.com/en-us/library/aa368007(VS.85).aspx(ComponentId条目解释了空GUID发生的情况)。

我刚刚使用WIX进行了测试,它似乎尊重空白的GUID条目(即,没有guid是自动生成的)。记住1:/ 绝对路径之间1规则的关键路径GUID

  • 如果更改了GUID,一个新的绝对路径应该用于组件的关键路径。
  • 如果更改绝对路径(例如,通过重命名文件或移动它),则应该更改GUID。

总之,GUID引用 - 计数组件的安装密钥路径,而不是文件 - 可能会移动,但是文件通过新的GUID具有新的身份(想象中的两个同名的文件不同的文件夹 - 它们是不同的文件,不同的身份)。

清理干净的GUID引用计数可能有点混乱。我发现如果我可以更改文件名称来有效地解决问题。我也产生了一个新的GUID,因此打破了老GUID的参考数量。您也可以重命名安装文件夹(理想情况下,这意味着所有组件GUID也应该更改)。 RemoveFile表概念可用于删除尚未注册为组件(例如生成的文件)的安装和/或卸载文件。

+0

我听到你说的是,因为一个空白的GUID甚至没有注册一个组件,它应该对其他组件没有影响。是对的吗? – 2009-10-14 18:03:43

+0

是的,一般来说,空白的GUID应该对其他组件没有影响,因为MSI在安装文件后忽略它。但是,很少有一个事实没有修改:由空白GUID安装的文件将不会被卸载。如果这是一个版本化文件,并且在添加一个guid之前不更改安装位置,理论上可能现有文件可能会阻止安装新文件版本(如果现有文件是较高版本)。如果您使用次要升级,还有一些其他不太可能的情况,但如果您不使用它,我不会进入它。 – 2009-10-14 19:13:27

+0

感谢您的详细解答!最后,让其他所有东西能够正确解除(从MSI日志中删除PreviouslyPinned = 1引用),我必须进入该PC上的注册表,并从 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData \ \ Components基于我在这里发现的提示http://blogs.msdn.com/icumove/archive/2008/06/17/windows-installer-error-2908-with-sub-errors- 1402-and-1450.aspx – 2009-10-16 08:21:10

0

更改组件的ID并使用有效的GUID应该是正确的。

+0

我希望通过“使事情正确”,你的意思是允许所有BeforelyPinned = 1组件卸载。当我改变这个时没有发生。 – 2009-10-16 08:05:03

+0

这个答案在这方面没有意义。使用带有GUID的组件是正常的方式,但这里主题是没有GUID的组件。 – Philm 2013-08-20 09:10:29

0

简短的回答是:

是,使用MSI组件没有GUID的是怎样的一个批复制方法。复制并忘记。 当然,您必须添加一件事:在每次卸载或卸载之前删除所有文件(条件为“重新安装或修补或删除”)或主要升级。没有这一点,它并没有什么意义。 即使使用CMD.exe/c RD/S/Q ...,您也可以在自定义操作中执行此操作。(当然,自定义代码比这更优雅)

如果你做得对,你可以设置一个非常简单的设置,而不需要所有的陷阱,MSI通常都有。 当然,如果递归删除一个文件的整个目录,它会更容易。

还没有试过,但我会:没有GUID和普通组件的“动态”组件,然后提供补丁。从理论上讲,这应该可以起作用,并且这对于许多修补程序之间高度变化的文件集导致的修补问题将是一个很好的解决方法。

0

1. 事实上,没有GUID的组件是真正的“动态文件链接”方法,通常被几个工具或人员错误地称赞。

其他“方式”: 2.生成的GUID自动仅仅是一个自动化步骤(但每一个好设定的基础设施建设:-) 在我眼里,这不是动态的,因为如果你把它动态的过程部分,你做错了:

2a。生成每次完全随机的GUID =>错误的算法

2b。仅在创建组件时第一次生成GUID,并对新资源进行智能“差异”识别以包装在新组件中。 =>唯一的工作文件树同步方法。但你可以在这里做很多错... 这是专家。