举个例子,假设我正在编写一个库,CommonLib
和一个Web应用程序WebUI
。 CommonLib
引用NLog v1.0
和WebUI
引用NLog v1.1
。
我很久以前写过CommonLib
我现在在WebUI
中使用它,现在它的NLog
版本比CommonLib
更新。 WebUI
调用CommonLib
来设置其日志记录。
这种情况是否可能?我是否始终需要更新NLog
中CommonLib
的版本,即使版本1.0
和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");