装配参考链是否需要传递?

时间:2013-12-12 16:16:04

标签: c# .net .net-assembly

举个例子,假设我正在编写一个库,CommonLib和一个Web应用程序WebUICommonLib引用NLog v1.0WebUI引用NLog v1.1

我很久以前写过CommonLib我现在在WebUI中使用它,现在它的NLog版本比CommonLib更新。 WebUI调用CommonLib来设置其日志记录。

这种情况是否可能?我是否始终需要更新NLogCommonLib的版本,即使版本1.01.1之间的方法签名没有更改?有解决方法吗?

1 个答案:

答案 0 :(得分:1)

Can NLog v2 be used with Common.Logging声称您可以简单地将旧版本重定向到较新版本(适用于v1到v2)。将其包含在您的配置文件中,与您的确切版本号匹配:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="1.1.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

bindingRedirect基本上说,“你可以继续并假装新版本将取代旧版本。”

如果不起作用,可以选择更多选项:

您可能需要将项目的NLog特定版本设置为True(在每个项目中&gt;参考&gt; NLog(右键单击,选择)属性)。使用指定的版本。

由于最新的NLog将包含在您的WebUI项目构建中,因此更难的是CommonLib使用的旧NLog。 How the Runtime Locates Assemblies是.Net尝试查找程序集的各种内容的很好的参考。

如果可以,将其添加到GAC是一种很好的方法。在Web环境中,这可能不是一种方法,因为向服务器的GAC添加内容可能并不容易。

How to build/deploy project that requires multiple versions of the same assembly?详细介绍了如何在网络环境中执行此操作,特别是使用web.config,例如你的可能是这个:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" />
      <codeBase version="1.0.0.505" href="bin\NLog\v1\NLog.dll" />
      <codeBase version="2.1.0.0" href="bin\NLog\v2\NLog.dll" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

另一种方法是使用Assembly.LoadFrom。例如。它适用于WebUI上的以下后期构建事件:

copy "$(SolutionDir)packages\NLog.1.0.0.505\lib\NLog.dll" "$(TargetDir)NLogv1.dll"

在尝试使用NLog之前,在CommonLib中调用了以下行:

System.Reflection.Assembly.LoadFrom("NLogv1.dll");