C# 是否可以将同一程序集的不同版本引用到单个项目中?

C# 是否可以将同一程序集的不同版本引用到单个项目中?,c#,.net,assemblies,C#,.net,Assemblies,在我的解决方案中,我有几个使用Log4Net(1.2和2.5)的项目 然后我有一个项目,在那里我做(其他项目的)所有单元测试。因此,根据我测试/模拟的内容,我需要log4net1.2或2.5 我了解到您可以在应用程序中支持单个程序集的不同版本(使用代码库等),但在项目中支持单个程序集的不同版本吗?如果是,怎么做 编辑: 下面是一个小项目(2个类,2个方法,2个构造函数),显示了我的问题: (我希望链接能够工作)您可以使用别名引用同一dll的不同版本,如下所述: 在客户端应用程序解决方案中添加对

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

然后我有一个项目,在那里我做(其他项目的)所有单元测试。因此,根据我测试/模拟的内容,我需要log4net1.2或2.5

我了解到您可以在应用程序中支持单个程序集的不同版本(使用代码库等),但在项目中支持单个程序集的不同版本吗?如果是,怎么做

编辑:

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


(我希望链接能够工作)

您可以使用
别名
引用同一dll的不同版本,如下所述:

在客户端应用程序解决方案中添加对两个DLL的引用。然后在参考节点下的解决方案资源管理器中选择第一个(旧版本)类库。在属性窗口中,将“别名”字段从“全局”更改为“旧版本”。在选择较新的类库后也进行类似的更改。那你就可以走了


多亏了皮科的建议,我才得以成功。但由于它需要的不仅仅是使用alias和重命名dll,我将写下整个过程

  • 从项目中删除现有引用(例如:log4net.dll)
  • 将文件夹添加到项目中以存储多个dll(例如:/Libs)
  • 在其中添加几个dll,并为它们指定唯一的文件名(如log4net.1.2.10.0.dll、log4net.1.2.15.0.dll)
  • 转到这些文件的属性并选择“复制:始终”或“复制:如果较新则复制”
  • 向这些文件添加引用
  • 为这些引用提供唯一的别名(例如:log4net\u 1\u 2\u 10\u 0、log4net\u 1\u 2\u 15\u 0)
  • 在代码中,使用“extern alias”关键字使用别名

    extern alias log4net_1_2_10_0;
    
    using log4net_1_2_10_0.log4net;
    using System.Web;
    ...
    
  • 将代码基添加到配置文件中。这些应该是指放入文件夹的dll,具有正确的版本和令牌

    
    

  • 当您读到可以在应用程序中支持单个程序集的不同版本(使用代码库等)时,您读到了什么?我对此表示怀疑,因为他们会两次定义相同的名称空间。@AUsr19532-您认为这有什么问题?多个程序集的类型存在于同一命名空间中是完全正常的。编译器如何知道是从一个版本还是从另一个版本使用Samplenamespace.lib.somthing?@AUsr19532-正如Pikoh的回答所示,如果它们的类型完全相同,那么可以使用别名,但我的观点是,程序集在同一名称空间中具有(不同)类型是非常常见的。例如,请参阅(来自系统程序集)和(来自mscorlib程序集),VS甚至不允许我添加引用“提及。。。无法添加。对组件的引用。。。项目中已存在。嗯..尝试重命名dll的名称,例如
    log4netold.dll
    log4netnew.dll
    这样更好,我可以添加两个引用。因此,我使用了一个别名,但是在单元测试运行时找不到全局别名上的别名(它编译了,但是测试涉及“global log4net”crashe)。我认为必须为这两个别名添加别名。请看我回答中的链接,它不起作用。这可能与XUnit有关吗?再竖琴?因为我使用它们来定义/运行我的测试。我遵循这个答案,但文件上的外部别名给出了错误“预期标识符”