8

因此,当有人将我的 nuget 包添加到他们的代码中时,我试图替换一个dependentAssembly。

我要更改的程序集是:

 <dependentAssembly>
    <assemblyIdentity name="Common.Logging.Core" publicKeyToken="af08829b84f0328e" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
  </dependentAssembly> 

因此,我使用这个 xml 文件和帮助:Web.config transforms - the missing manual

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly xdt:Transform="Replace" xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name:'Common.Logging.Core')">
        <assemblyIdentity name="Common.Logging.Core" publicKeyToken="af08829b84f0328e" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="2.2.0.0" />
    </dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

但我收到错误消息:将转换应用于项目中的“web.config”时发生错误:“blabla”的限定名称无效。

注意到当我将“替换”更改为“删除”时,它正在删除完整的dependentAssembly,但不知何故,它再次将相同的dependentAssembly 添加到 web.config 中。也许是因为在 web.config 转换之后添加了 Common.Logging.Core 依赖项?

也许这就是替换不起作用的原因?

4

2 回答 2

9

尝试这个:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

      <!-- first completely remove the parent element -->
      <dependentAssembly xdt:Transform="RemoveAll"
                         xdt:Locator="Condition(starts-with(./_defaultNamespace:assemblyIdentity/@name,'Microsoft.Diagnostics.Tracing.EventSource'))">
      </dependentAssembly>

      <!-- then add the new block -->
      <dependentAssembly xdt:Transform="Insert">
        <assemblyIdentity name="Microsoft.Diagnostics.Tracing.EventSource" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.1.16.0" newVersion="1.1.16.0 " />
      </dependentAssembly>

    </assemblyBinding>
  </runtime>
于 2017-08-18T15:40:51.440 回答
4

下面的 XML 将绑定重定向应用到 assemble Common.Logging.Core。它包含两个变换操作。InsertIfMissing如果程序集条目不存在,第一个, 插入一个新条目,如果Replace现有重定向已经存在,第二个 , 将替换它。

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1">
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly xdt:Transform="InsertIfMissing" xdt:Locator="Condition(asmv1:assemblyIdentity/@name='Common.Logging.Core')">
        <assemblyIdentity name="Common.Logging.Core" publicKeyToken="af08829b84f0328e" culture="neutral" xmlns="urn:schemas-microsoft-com:asm.v1"/>
        <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" xmlns="urn:schemas-microsoft-com:asm.v1"/>       
      </dependentAssembly>
      <dependentAssembly xdt:Transform="Replace" xdt:Locator="Condition(asmv1:assemblyIdentity/@name='Common.Logging.Core')">
        <assemblyIdentity name="Common.Logging.Core" publicKeyToken="af08829b84f0328e" culture="neutral" xmlns="urn:schemas-microsoft-com:asm.v1"/>
        <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" xmlns="urn:schemas-microsoft-com:asm.v1"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

注意asmv1添加到configuration元素的命名空间。需要它来工作。

注意:我想避免在转换中添加assemblyIdentitybindingRedirect元素,InsertIfMissing但无法使其工作。如果你知道怎么做,请告诉我。

于 2019-01-11T15:19:56.400 回答