Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WiX公共组件作为合并模块和注册表中的INSTALLDIR_Wix_Windows Installer - Fatal编程技术网

WiX公共组件作为合并模块和注册表中的INSTALLDIR

WiX公共组件作为合并模块和注册表中的INSTALLDIR,wix,windows-installer,Wix,Windows Installer,我想有两个安装与共同的部分。所以我使用了合并模块,创建了两个wix安装程序 以下是我想通过更多细节实现的目标(这里描述的问题已经解决): 我使用WixUI\u InstallDir,所以用户可以选择安装应用程序的目录。 当第二个安装程序启动时,我想加载之前选择的安装目录 当用户不更改默认路径时,一切正常。但若在第一次安装中更改了INSTALLDIR,那个么第二个安装程序会将插件添加到正确的路径,但也会将核心提取到默认路径,这是错误的。 但是,“目标文件夹”对话框上会显示正确的路径(来自以前的安装

我想有两个安装与共同的部分。所以我使用了合并模块,创建了两个wix安装程序

以下是我想通过更多细节实现的目标(这里描述的问题已经解决):

我使用WixUI\u InstallDir,所以用户可以选择安装应用程序的目录。 当第二个安装程序启动时,我想加载之前选择的安装目录

当用户不更改默认路径时,一切正常。但若在第一次安装中更改了INSTALLDIR,那个么第二个安装程序会将插件添加到正确的路径,但也会将核心提取到默认路径,这是错误的。 但是,“目标文件夹”对话框上会显示正确的路径(来自以前的安装)

下面是重要的代码:

<Property Id="CORE_INSTALLATION_PATH">
  <RegistrySearch Id="InstallFolderRegistrySearch" Type="raw" Root="HKLM" Key="SOFTWARE\PluginCompany\Plugins" Name="InstallFolder"/>
</Property>

<SetDirectory Id="INSTALLDIR" Value="[CORE_INSTALLATION_PATH]">CORE_INSTALLATION_PATH</SetDirectory>

<DirectoryRef Id="TARGETDIR">
  <Component Id="CoreRegistryEntries" Guid="{C1701385-12CA-47EF-9FB2-884139B56390}">
    <RegistryKey Root="HKLM" Key="SOFTWARE\PluginCompany\Plugins" Action="createAndRemoveOnUninstall">
      <RegistryValue Type="string" Name="InstallFolder" Value="[INSTALLDIR]" KeyPath="yes"/>
    </RegistryKey>
  </Component>
</DirectoryRef>

核心安装路径

您可以从以下几件事下载并运行完整的示例解决方案:

  • 确保您有正确的注册表,可能需要Win64搜索,也可能不需要,这取决于数据是在本机注册表中还是在x86 WOW注册表中

  • 如果还不算太晚,通常最好将共享组件安装到公共位置(例如公司名称和产品名称的公共文件文件夹),以避免此类情况。如果不是所有的文件都在主应用程序文件夹中,只要应用程序不在乎,就可以了

  • 使用详细日志进行安装,并查看AppSearch正在执行的操作—它将在那里设置(或不设置)该属性值。在这里,您将看到是否正在设置该属性,以及随后是否出现其他问题

  • 在日志中,我发现:

    MSI (c) (38:CC) [08:54:03:324]: Dir (target): Key: INSTALLDIR   , Object: C:\Program Files (x86)\PluginCompanyFolder\PluginInstaller2\
    MSI (c) (38:CC) [08:54:03:324]: Dir (target): Key: INSTALLDIR.751E70EB_CF76_413B_B8C8_231A31F9C946  , Object: C:\Program Files (x86)\PluginCompanyFolder\PluginInstaller\
    
    因此有两个属性INSTALLDIR和带有guid的INSTALLDIR。 第二个属性由合并模块添加,更新INSTALLDIR不会更改第二个属性。这就是第二个安装程序将核心组件提取到自定义位置的原因

    要禁用Muduralization,我使用了SuppressModule属性:

    <Property Id="INSTALLDIR" SuppressModularization="yes"/>
    
    
    
    请注意,模块化描述位于:

    用于禁止合并中此属性标识符的模块化 模块。强烈反对使用此功能;它应该 只有在极少数情况下,作为最后解决办法才有必要