Wix在修复操作上重新注册DLL

时间:2015-09-16 07:41:33

标签: dll wix windows-installer msiexec wix3.8

我有一个MSI,其中包含使用以下代码注册的DLL文件:

<Fragment>
  <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
    <Component Id="XYZ.dll" Guid="<GUID>">
      <File Id="XYZ.dll" KeyPath="yes" Source="XYZ.dll" SelfRegCost="1" />
    </Component>
  </ComponentGroup>
</Fragment>

现在安装后我手动注册了不同版本的文件(使用regsvr32)。我重新运行MSI安装并进行修复。在修复操作中,MSI DLL不会覆盖手动DLL。是否有解决方法,以便在执行修复操作时可以获取MSI DLL。

2 个答案:

答案 0 :(得分:1)

修复的目的是将已安装产品的状态恢复为MSI文件中的规范。那么,究竟是什么&#34;不同版本&#34;意思?例如,如果您的Dll是文件版本2.0,并且您将其替换为1.0版本,那么修复将恢复2.0版本。但是,如果将3.0文件版本替换为3.0文件版本,则修复将不会使用较低版本覆盖较高版本。这是因为修复的默认REINSTALLMODE是(IIRC)pocmus,这意味着如果丢失,等于或旧版本则替换。

所以这可能有所帮助,但如果没有,你应该说一下你的文件版本,因为替换是基于它们的。

答案 1 :(得分:0)

我认为您说COM注册是通过在两个不同文件中的任何一个上使用自注册来编写的。在您的方案中(包含编号和名称),安装了MSI,注册了ComClassA_v2.dll的第2版。然后有人在版本1的ComClassA_v1.dll中复制并注册它。您现在希望产品修复重新注册ComClassAv2.dll。

它不会因为文件是keypath。该文件已版本化。因此,将现有文件的版本与MSI中的版本进行比较。它们匹配,因此该组件被认为不需要修复。

我会尝试避免这种实施“策略设计模式”的方法。但是,对您的过程进行的最小更改是在修复之前删除ComClassA_v2.dll。