Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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
C# 使用绑定重定向升级两个项目之一_C#_Assembly Binding Redirect - Fatal编程技术网

C# 使用绑定重定向升级两个项目之一

C# 使用绑定重定向升级两个项目之一,c#,assembly-binding-redirect,C#,Assembly Binding Redirect,我找不到针对这种情况的信息,因为所有信息都是关于升级整个解决方案的,而不是一次升级一个项目 实际情况是,我想在log4net中使用udp appender,为此我正在将log4net版本从1.2.10.0升级到1.2.15.0。但我也有一个旧版本的nHibernate引用并使用版本1.2.10.0的API 我想通过只升级大型系统的一小部分来降低新版本在生产使用中出现问题的风险。因此,我将仅在特定服务中引用新版本,而共享组件将引用旧版本 例子 库项目A(nhiberate)以强名称引用v1 库项目

我找不到针对这种情况的信息,因为所有信息都是关于升级整个解决方案的,而不是一次升级一个项目

实际情况是,我想在log4net中使用udp appender,为此我正在将log4net版本从1.2.10.0升级到1.2.15.0。但我也有一个旧版本的nHibernate引用并使用版本1.2.10.0的API

我想通过只升级大型系统的一小部分来降低新版本在生产使用中出现问题的风险。因此,我将仅在特定服务中引用新版本,而共享组件将引用旧版本

例子 库项目A(nhiberate)以强名称引用v1

库项目B通过弱名称引用v1(即仅“log4net”)

应用项目C:

  • 引用项目B的程序集
  • 引用项目A的程序集
  • 参考文献v2
  • 将强名称v1重定向到v1.dll
应用程序项目D弱引用了项目B和v1

然后在项目C中,我希望所有使用log4net的非强名称都使用v2,以及任何更具体的引用来检查config中的绑定重定向,然后使用现有的重定向,或者失败

实际上,项目B也使用了重定向,所以我没有从升级中获益

在项目B的程序集中,必须有一些元数据在v1可用时“更喜欢”使用v1。是这样吗?当项目C引用v2时,是否有可能强制项目B使用v2(同时不会导致项目D失败)

配置示例:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
        <codeBase version="1.2.10.0" href="log4net-1.2.10.0.dll" />
      </dependentAssembly>
    </assemblyBinding>
</runtime>

ildasm.exe
向我显示程序集在清单中包含特定的版本信息。创建示例解决方案并显示问题也很容易

说明

除非配置文件中的显式版本策略覆盖了应用程序,否则应用程序只能使用其生成和测试时使用的版本运行

我希望元数据可以在项目C使用的dll副本中编辑,而不能在项目D使用的副本中编辑

然而,这变得有点复杂

出于我的目的,从头开始编写一个udp appender可能非常容易,它没有log4net 1.2.10.0中的ip v4/v6地址错误

我选择的方法是升级整个系统以使用较新的版本,并在低风险的生产环境中进行更改