.NET 引用两个不同版本的dll的几种方法

 更新时间:2026年01月12日 09:44:22   作者:Yashar Qian  
在.NET中引用两个不同版本的DLL有多种方法,包括使用外部别名、程序集绑定重定向、动态加载、创建包装器程序集和使用不同的应用程序域,下面就来具体介绍一下,感兴趣的可以了解一下

在.NET中引用两个不同版本的DLL是一个常见的需求,特别是在处理依赖冲突或逐步升级时。以下是几种解决方案:

1. 使用外部别名 (External Aliases)

这是最常用的方法,允许你在同一个项目中引用两个不同版本的DLL。

步骤:

第一步:添加引用并设置别名

  1. 在解决方案资源管理器中添加两个版本的DLL引用
  2. 右键点击每个引用 → 属性
  3. 在属性窗口中设置不同的别名(如 Version1Version2

第二步:在代码中使用别名

// 在文件顶部定义外部别名
extern alias Version1;
extern alias Version2;

using System;

class Program
{
    static void Main()
    {
        // 使用版本1
        Version1::MyNamespace.MyClass obj1 = new Version1::MyNamespace.MyClass();
        obj1.DoSomething();
        
        // 使用版本2
        Version2::MyNamespace.MyClass obj2 = new Version2::MyNamespace.MyClass();
        obj2.DoSomething();
        
        // 或者使用全局命名空间限定
        var obj3 = new global::MyNamespace.MyClass(); // 使用默认引用
    }
}

2. 使用程序集绑定重定向

app.configweb.config 中配置绑定重定向:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MyAssembly" 
                         publicKeyToken="32ab4ba45e0a69a1" 
                         culture="neutral" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
        <codeBase version="1.0.0.0" href="lib\v1\MyAssembly.dll" rel="external nofollow" />
        <codeBase version="2.0.0.0" href="lib\v2\MyAssembly.dll" rel="external nofollow" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

3. 使用 Assembly.LoadFrom 动态加载

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        // 动态加载不同版本的程序集
        Assembly version1 = Assembly.LoadFrom(@"path\to\version1\MyAssembly.dll");
        Assembly version2 = Assembly.LoadFrom(@"path\to\version2\MyAssembly.dll");
        
        // 通过反射创建实例
        dynamic obj1 = version1.CreateInstance("MyNamespace.MyClass");
        dynamic obj2 = version2.CreateInstance("MyNamespace.MyClass");
        
        obj1.DoSomething();
        obj2.DoSomething();
    }
}

4. 创建包装器程序集

为每个版本创建独立的包装器:

// Version1Wrapper.cs
public class Version1Wrapper
{
    private dynamic _instance;
    
    public Version1Wrapper(string dllPath)
    {
        var assembly = Assembly.LoadFrom(dllPath);
        _instance = assembly.CreateInstance("MyNamespace.MyClass");
    }
    
    public void DoSomething() => _instance.DoSomething();
}

// 使用包装器
var wrapperV1 = new Version1Wrapper(@"lib\v1\MyAssembly.dll");
var wrapperV2 = new Version1Wrapper(@"lib\v2\MyAssembly.dll");

5. 使用不同的应用程序域

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        AppDomain domain1 = AppDomain.CreateDomain("Version1Domain");
        AppDomain domain2 = AppDomain.CreateDomain("Version2Domain");
        
        // 在不同应用域中加载不同版本
        domain1.ExecuteAssembly(@"path\to\version1\app.exe");
        domain2.ExecuteAssembly(@"path\to\version2\app.exe");
        
        AppDomain.Unload(domain1);
        AppDomain.Unload(domain2);
    }
}

最佳实践建议

  1. 优先使用外部别名 - 对于大多数场景这是最直接的方法
  2. 考虑架构设计 - 如果可能,尽量避免同时使用多个版本
  3. 使用接口抽象 - 通过接口隔离不同版本的实现细节
  4. 版本隔离 - 将不同版本放在不同的文件夹中
  5. 充分的测试 - 确保版本间的兼容性和正确性

选择哪种方法取决于你的具体需求、应用程序架构和部署环境。

到此这篇关于.NET 引用两个不同版本的dll的几种方法的文章就介绍到这了,更多相关.NET 引用不同版本dll内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ASP.NET MVC5网站开发咨询管理的架构(十一)

    ASP.NET MVC5网站开发咨询管理的架构(十一)

    这篇文章主要介绍了ASP.NET MVC5网站开发咨询管理的架构,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • ASP.NET Core构建OData查询Restful API

    ASP.NET Core构建OData查询Restful API

    这篇文章主要为大家介绍了ASP.NET Core建构OData实体模型实现Restful API查询,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • ASP.NET MVC 导出Word报表

    ASP.NET MVC 导出Word报表

    本文主要介绍了ASP.NET MVC 导出Word报表的方法,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • asp.net(c#)网页跳转七种方法小结

    asp.net(c#)网页跳转七种方法小结

    在asp.net下,经常需要页面的跳转,下面是具体的几种方法。跳转页面是大部编辑语言中都会有的,正面我们来分别介绍一下关于.net中response.redirect sever.execute server.transfer 三种页面跳转的方法
    2009-11-11
  • .NET Core 2.2新增的部分功能使用尝鲜指南

    .NET Core 2.2新增的部分功能使用尝鲜指南

    这篇文章主要给大家介绍了关于.NET Core 2.2新增的部分功能使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-12-12
  • 解决ASP.NET中

    解决ASP.NET中"/"应用程序中的服务器错误的方法

    这篇文章主要介绍了解决ASP.NET中"/"应用程序中的服务器错误的方法,,需要的朋友可以参考下
    2016-03-03
  • .NET数组使用中的注意事项小结

    .NET数组使用中的注意事项小结

    这篇文章主要介绍了.NET数组使用中的注意事项,总结了常见的三个数组使用中的注意事项,对于.NET初学者有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • Asp.Net上传图片验证代码的小例子

    Asp.Net上传图片验证代码的小例子

    这篇文章介绍了Asp.Net上传图片验证代码的小例子,有需要的朋友可以参考一下
    2013-07-07
  • asp.net中的check与uncheck关键字用法解析

    asp.net中的check与uncheck关键字用法解析

    这篇文章主要介绍了asp.net中的check与uncheck关键字用法,以实例形式较为详细的分析了check与uncheck关键字的各种常见用法与使用时的注意事项,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • ASP.NET MVC缓存过滤器用法

    ASP.NET MVC缓存过滤器用法

    本文详细讲解了ASP.NET MVC缓存过滤器的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论