7

您可以在这里那里阅读 web.config 转换文档,但是似乎没有人讨论两个白象:

  1. 您如何在 aConditionXPath转换中执行变量替换,以及...
  2. aLocator可以有意义地嵌套在 a 中Transform吗?

让我举一个可以从这两种选择中受益的例子。假设我有这个:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

假设我想完全擦除dependentAssembly与 xpath 匹配的节点及其子节点//runtime/assemblyBinding/dependentAssembly[assemblyIdentity@name='System.Web.Mvc']。为此,我可能想要这样的东西:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity 
          name="System.Web.Mvc" 
          xdt:Remove 
          xdt:Locator="Condition(..[*@name=$name])" 
      />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

@name=$name很明显,我根据xpath 变量概念编写了语法,但这个例子说明了为什么我想要那个特性。这支持吗?我必须如何调整我的语法以利用这一点?我可以输入一个字符串文字,但我只想知道这是否可能。

我可能尝试删除dependentAssembly节点的另一种方法是:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" xdt:Transform="Remove">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" xdt:Locator="Match(name)" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

请注意,Transform它位于祖父节点上,而定位器位于叶节点上。以上合法吗?这个想法是只删除dependantAssembly具有内部定位器匹配的节点。

除了这两种方法,您将如何删除定位dependantAssembly及其所有子节点?

4

3 回答 3

9

问题是 assemblyBinding 标记上的命名空间属性。

删除 AspNetHelper 参考对我有用:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly xdt:Transform="Remove" 
                           xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.VisualStudio.Enterprise.AspNetHelper')">
        </dependentAssembly>
    </assemblyBinding>
</runtime>
于 2013-02-23T13:18:39.587 回答
7

@Thommy 的解决方案对我有用,@LifeintheGrid 的解决方案使用了我想要删除的实际程序集,所以我将两者结合起来并简化为:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly xdt:Transform="RemoveAll"
                           xdt:Locator="Condition(starts-with(./_defaultNamespace:assemblyIdentity/@name,'Microsoft.VisualStudio.QualityTools'))">
        </dependentAssembly>
    </assemblyBinding>
</runtime>
于 2013-11-22T20:58:44.747 回答
3

这段代码最终为我工作。我将转换移动到dependentAssembly 节点。

<runtime>
  <assemblyBinding>
    <!-- ending /dependentAssembly is required or tranforms fail -->
    <dependentAssembly xdt:Transform="Remove" xdt:Locator="Condition(assemblyIdentity/@name='Microsoft.VisualStudio.QualityTools.HostAdapters.ASPNETAdapter')"  ></dependentAssembly>
    <dependentAssembly xdt:Transform="Remove" xdt:Locator="Condition(assemblyIdentity/@name='Microsoft.VisualStudio.QualityTools.Common')"  ></dependentAssembly>
    <dependentAssembly xdt:Transform="Remove" xdt:Locator="Condition(assemblyIdentity/@name='Microsoft.VisualStudio.QualityTools.ExecutionCommon')"></dependentAssembly>
    <dependentAssembly xdt:Transform="Remove" xdt:Locator="Condition(assemblyIdentity/@name='Microsoft.VisualStudio.QualityTools.Resource')"  ></dependentAssembly>
  </assemblyBinding>
</runtime>  
于 2012-10-22T16:47:08.103 回答