是否可以将同一装配的不同版本引用到单个项目中?

时间:2016-05-19 06:38:17

标签: c# .net assemblies

在我的解决方案中,我有几个使用Log4Net(1.2和2.5)的项目。

然后我有一个项目,我在那里进行所有单元测试(其他项目)。所以我的情况取决于我测试/模拟我需要Log4Net 1.2或2.5。

我读过你可以在应用程序中支持不同版本的单个程序集(使用代码库等),但是甚至可以将单个程序集的不同版本支持到项目中吗?如果是这样,怎么样?

编辑:

这是一个很小的(2个类,2个方法,2个构造函数)项目,显示了我的问题:

https://srv-file1.gofile.io/download/EQFdOs/212.76.254.142/Log4NetMulti.zip

(我希望链接工作)

2 个答案:

答案 0 :(得分:12)

感谢Pikoh的建议,我设法让它发挥作用。但是因为它需要的不仅仅是使用别名并重命名dll,所以我会记下整个过程。

  1. 从项目中删除 现有参考(例如:log4net.dll)
  2. 向项目添加文件夹以存储多个dll(例如:/ Libs)
  3. 在其中添加几个dll并为其提供唯一文件名(如log4net.1.2.10.0.dll,log4net.1.2.15.0.dll)
  4. 转到这些文件的媒体资源并选择“复制:始终”或“复制:复制如果更新
  5. 向这些文件添加参考
  6. 为这些参考提供唯一别名(例如:log4net_1_2_10_0,log4net_1_2_15_0)
  7. 在您的代码中,使用“ extern别名”关键字来使用别名。

    extern alias log4net_1_2_10_0;
    
    using log4net_1_2_10_0.log4net;
    using System.Web;
    ...
    
  8. 将代码库添加到配置文件中。这些应该引用您放入文件夹的dll,并使用正确的版本和令牌。

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

答案 1 :(得分:4)

您可以使用Alias引用同一dll的不同版本,如此处MSDN所述:

  

在客户端应用程序解决方案中添加对这两个dll的引用。然后在引用节点下的Solution Explorer中选择第一个(旧版本)类库。在属性窗口中,将Aliases字段从global更改为oldVer。选择较新的类库后也要进行类似的更改。你很高兴去......