在 WiX 安装期间向 XML 文件添加同名元素?

问题描述 投票:0回答:1

我正在尝试使用 WiX 的 util:XmlConfig -

将以下 [裁剪] XML 添加到 .config 文件
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

可以在 here 找到最近对此的尝试,但无论哪种方式都行不通。我尝试过其他方法,但以某种方式它们都失败了。我将如何使用 XMLUConfig 添加这些类似命名的 dependentAssembly 元素并访问它们以添加和更新子 assemblyIdentity 元素?

我还会提到我在 C# 中有一个正在运行的 CustomAction,它目前扮演着这个角色,但我认为这不是解决它的最佳方式(因为它本身不支持卸载)。

谢谢!

xml visual-studio-2012 wix wix3.7
1个回答
0
投票

我遇到了完全相同的问题,我发现这是由于我访问具有 ElementPath 中的索引的 dependentAssembly 元素的顺序所致。在尝试使用 XPath 访问它们之前,我没有创建我的 dependentAssembly 元素。

为了在我的 web.config 中生成以下内容:

<runtime>
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="LaunchDarkly.Logging" publicKeyToken="d9182e4b0afd33e7" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.2" newVersion="7.0.0.2" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
  </dependentAssembly>
 </assemblyBinding>
</runtime>

我使用了以下wix代码:

    <util:XmlConfig Id="NewItem0" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration" Name="runtime" Node="element" On="install" Sequence="1"/>
    <util:XmlConfig Id="NewItem1" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime" Name="assemblyBinding" Node="element" On="install" Sequence="2"/>
    
    <!-- Dependent assemblies -->
    <util:XmlConfig Id="NewItem2" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding" Name="dependentAssembly" Node="element" On="install" Sequence="3"/>
    <util:XmlConfig Id="NewItem10" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding" Name="dependentAssembly" Node="element" On="install" Sequence="3"/>
    <util:XmlConfig Id="NewItem100" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding" Name="dependentAssembly" Node="element" On="install" Sequence="3"/>
    <util:XmlConfig Id="NewItem101" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding" Name="dependentAssembly" Node="element" On="install" Sequence="3"/>
    
    <!-- System.Runtime.CompilerServices.Unsafe -->
    <util:XmlConfig Id="ProjectName_DependentAssembly0_AssemblyIdentity" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly" Name="assemblyIdentity" Node="element" On="install" Sequence="4">
        <util:XmlConfig Id="ProjectName_DependentAssembly0_AssemblyIdentity_1" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly0_AssemblyIdentity" Name="name" Value="System.Runtime.CompilerServices.Unsafe" />
        <util:XmlConfig Id="ProjectName_DependentAssembly0_AssemblyIdentity_2" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly0_AssemblyIdentity" Name="publicKeyToken" Value="b03f5f7f11d50a3a" />
        <util:XmlConfig Id="ProjectName_DependentAssembly0_AssemblyIdentity_3" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly0_AssemblyIdentity" Name="culture" Value="neutral" />   
    </util:XmlConfig>
      
    <util:XmlConfig Id="ProjectName_DependentAssembly0_BindingRedirect" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly" Name="bindingRedirect" Node="element" On="install" Sequence="4">
        <util:XmlConfig Id="ProjectName_DependentAssembly0_BindingRedirect_1" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly0_BindingRedirect" Name="oldVersion" Value="0.0.0.0-6.0.0.0" />
        <util:XmlConfig Id="ProjectName_DependentAssembly0_BindingRedirect_2" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly0_BindingRedirect" Name="newVersion" Value="6.0.0.0" />   
    </util:XmlConfig>
    
    <!-- LaunchDarkly.Logging -->
    <util:XmlConfig Id="ProjectName_DependentAssembly1_AssemblyIdentity" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly[\[]1[\]]" Name="assemblyIdentity" Node="element" On="install" Sequence="4">
        <util:XmlConfig Id="ProjectName_DependentAssembly1_AssemblyIdentity_1" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly1_AssemblyIdentity" Name="name" Value="LaunchDarkly.Logging" />
        <util:XmlConfig Id="ProjectName_DependentAssembly1_AssemblyIdentity_2" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly1_AssemblyIdentity" Name="publicKeyToken" Value="d9182e4b0afd33e7" />
        <util:XmlConfig Id="ProjectName_DependentAssembly1_AssemblyIdentity_3" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly1_AssemblyIdentity" Name="culture" Value="neutral" />   
    </util:XmlConfig>
          
    <util:XmlConfig Id="ProjectName_DependentAssembly1_BindingRedirect" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly[\[]1[\]]" Name="bindingRedirect" Node="element" On="install" Sequence="4">
        <util:XmlConfig Id="ProjectName_DependentAssembly1_BindingRedirect_1" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly1_BindingRedirect" Name="oldVersion" Value="0.0.0.0-2.0.0.0" />
        <util:XmlConfig Id="ProjectName_DependentAssembly1_BindingRedirect_2" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly1_BindingRedirect" Name="newVersion" Value="2.0.0.0" />   
    </util:XmlConfig>
      
    <!-- System.Text.Json -->
    <util:XmlConfig Id="ProjectName_DependentAssembly2_AssemblyIdentity" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly[\[]2[\]]" Name="assemblyIdentity" Node="element" On="install" Sequence="4">
        <util:XmlConfig Id="ProjectName_DependentAssembly2_AssemblyIdentity_1" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly2_AssemblyIdentity" Name="name" Value="System.Text.Json" />
        <util:XmlConfig Id="ProjectName_DependentAssembly2_AssemblyIdentity_2" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly2_AssemblyIdentity" Name="publicKeyToken" Value="cc7b13ffcd2ddd51" />
        <util:XmlConfig Id="ProjectName_DependentAssembly2_AssemblyIdentity_3" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly2_AssemblyIdentity" Name="culture" Value="neutral" />   
    </util:XmlConfig>
          
    <util:XmlConfig Id="ProjectName_DependentAssembly2_BindingRedirect" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly[\[]2[\]]" Name="bindingRedirect" Node="element" On="install" Sequence="4">
        <util:XmlConfig Id="ProjectName_DependentAssembly2_BindingRedirect_1" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly2_BindingRedirect" Name="oldVersion" Value="0.0.0.0-7.0.0.2" />
        <util:XmlConfig Id="ProjectName_DependentAssembly2_BindingRedirect_2" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly2_BindingRedirect" Name="newVersion" Value="7.0.0.2" />   
    </util:XmlConfig>
  
    <!-- System.Memory -->
    <util:XmlConfig Id="ProjectName_DependentAssembly3_AssemblyIdentity" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly[\[]3[\]]" Name="assemblyIdentity" Node="element" On="install" Sequence="4">
        <util:XmlConfig Id="ProjectName_DependentAssembly3_AssemblyIdentity_1" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly3_AssemblyIdentity" Name="name" Value="System.Memory" />
        <util:XmlConfig Id="ProjectName_DependentAssembly3_AssemblyIdentity_2" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly3_AssemblyIdentity" Name="publicKeyToken" Value="cc7b13ffcd2ddd51" />
        <util:XmlConfig Id="ProjectName_DependentAssembly3_AssemblyIdentity_3" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly3_AssemblyIdentity" Name="culture" Value="neutral" />   
    </util:XmlConfig>
          
    <util:XmlConfig Id="ProjectName_DependentAssembly3_BindingRedirect" Action="create" File="[PROJECTNAME]\web.config" ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly[\[]3[\]]" Name="bindingRedirect" Node="element" On="install" Sequence="4">
        <util:XmlConfig Id="ProjectName_DependentAssembly3_BindingRedirect_1" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly3_BindingRedirect" Name="oldVersion" Value="0.0.0.0-4.0.1.2" />
        <util:XmlConfig Id="ProjectName_DependentAssembly3_BindingRedirect_2" File="[PROJECTNAME]\web.config" ElementId="ProjectName_DependentAssembly3_BindingRedirect" Name="newVersion" Value="4.0.1.2" />   
    </util:XmlConfig>

在您想要的 dependentAssembly 中获取 assemblyIdentity 和 bindingRedirect 元素的关键组件是使用 ElementPath 中的索引,就像我上面的代码一样:

ElementPath="//configuration/runtime/assemblyBinding/dependentAssembly[[]2[]]"

© www.soinside.com 2019 - 2024. All rights reserved.