【问题标题】:Is it possible to reference different version of the same assembly into a single project?是否可以将同一程序集的不同版本引用到单个项目中?
【发布时间】:2016-05-19 06:38:17
【问题描述】:

在我的解决方案中,我有几个使用 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

(我希望链接有效)

【问题讨论】:

  • 当你读到你可以在应用程序中支持单个程序集的不同版本(使用代码库等)时,你读到了什么
  • 我怀疑他们会定义相同的命名空间两次。
  • @AUsr19532 - 您对此有何看法?多个程序集具有存在于同一命名空间中的类型是完全正常的。
  • 编译器如何知道是否使用一个版本或另一个版本的 Samplenamespace.lib.somthing?
  • @AUsr19532 - 您可以使用别名,如 Pikoh 的回答所示,如果它们具有完全相同的 类型,但我的观点是,程序集拥有(不同) 类型在相同的命名空间中。参见例如System.Uri(来自系统程序集)和System.Attribute(来自 mscorlib 程序集)

标签: c# .net assemblies


【解决方案1】:

多亏了 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 alias”关键字。

    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>  
    

【讨论】:

  • 我遵循这个答案,但我在文件上的外部别名给出了“预期标识符”的错误
【解决方案2】:

您可以使用 Alias 引用同一 dll 的不同版本,此处解释为 MSDN

在您的客户端应用程序解决方案中添加对这两个 dll 的引用。然后在引用节点下的解决方案资源管理器中选择第一个(旧版本)类库。在属性窗口中,将 Aliases 字段从 global 更改为 oldVer。在选择较新的类库后也进行类似的更改。然后你就可以走了……

【讨论】:

  • VS 甚至不让我添加引用“无法添加对...的引用。对组件的引用...已经存在于项目中。
  • 嗯..尝试重命名dll的名称,例如log4netold.dlllog4netnew.dll
  • 这样更好,我可以添加两个引用。所以我使用了一个别名,但是当单元测试运行时找不到全局别名上的那个(它编译但随后涉及“global log4net”的测试崩溃了)。
  • 我认为您必须为两者添加别名。请参阅我的答案中的链接
  • 它不工作。它可能与XUnit有关吗?锐器?因为我使用它们来定义/运行我的测试。
猜你喜欢
  • 1970-01-01
  • 2014-01-08
  • 2014-10-08
  • 2011-11-04
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多