我有一个功能有几个组件。一个组件包含目录中的动态链接文件。 当我删除该目录中的一个文件,构建设置并运行升级时,不会替换任何文件。 在日志中我发现了这个错误:
MSI (s) (5C:D8) [12:28:41:180]: SELMGR: ComponentId '{8F4E8185-5B89-9FC9-9FD5-3200102A0265}' is registered to feature 'MyFeatureName', but is not present in the Component table. Removal of components from a feature is not supported!
MSI (s) (5C:D8) [12:28:41:180]: SELMGR: Removal of a component from a feature is not supported
如何删除动态链接文件?
答案 0 :(得分:1)
书的答案是使用重大升级。
终极MSI黑客的答案是在ORCA中编辑以前的MSI以获得确切的主键和GUID值。将该组件静态编写到最新的ISM中,然后实现“穿孔组件”模式。这意味着您设置Revaluate属性,然后为其提供始终求值为false的条件。通过这种方式,新的MSI仍然具有该组件,但它将从机器中删除。
答案 1 :(得分:0)
Chris描述了我通常用来解决这个问题的方法。但是,我发现更快的方法是重命名动态链接文件的父文件夹。只需从MyFolder更改为我的文件夹即可 - 或者其他任何名称。原因是您将旧文件与新文件分离。您不再指向相同的绝对路径,因此MSI引用计数会正确删除所有旧文件。而且你需要进行一次重大升级才能正常工作,就像克里斯所说的那样。
非常好地总结了小型升级工作所需的内容(以及其他详细信息):http://www.installsite.org/pages/en/msi/updates.htm
从上面的站点:" 如果从组件中删除文件或注册表项,则必须分别填充RemoveFile或RemoveRegistry表以删除孤立的资源。" 。这可能也有效,但我不会使用这种方法。
我个人会完全避免动态文件链接。我没有能够使用动态链接文件而没有它导致问题。一般来说,他们一直在更新和修补问题,但也有其他类型。它真的不是一个好用的功能。相反,您应该利用文件夹名称更改的机会静态添加所有文件。
您可以在此处找到有关MSI组件引用计数的更多详细信息:https://stackoverflow.com/a/1422121/129130
总而言之,这就是我要做的事情: