详情

首页手游攻略 .NET 引用两个不同版本的dll的几种做法实用指南

.NET 引用两个不同版本的dll的几种做法实用指南

佚名 2026-08-28 15:50:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“.NET 引用两个不同版本的dll的几种做法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 1. 采用外部别名 (External Aliases)
    • 步骤:
      • 第一步:添加引用并设置别名
      • 第二步:在代码中采用别名
  • 2. 采用程序集绑定重定向
    • 3. 采用 Assembly.LoadFrom 动态加载
      • 4. 新建包装器程序集
        • 5. 采用不同的应用程序域
          • 最佳实践建议

            实际处理时,在.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="libv1MyAssembly.dll" rel="external nofollow" />
                    <codeBase version="2.0.0.0" href="libv2MyAssembly.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(@"pathtoversion1MyAssembly.dll");
                    Assembly version2 = Assembly.LoadFrom(@"pathtoversion2MyAssembly.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(@"libv1MyAssembly.dll");
            var wrapperV2 = new Version1Wrapper(@"libv2MyAssembly.dll");

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

            using System;
            using System.Reflection;

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

            最佳实践建议

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

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

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

            您可能感兴趣的文章:

            • asp.net core3.1 引用的元包dll版本兼容性问题解决方案
            • Asp.Net数据控件引用AspNetPager.dll分页实现代码

            相关资讯
            点击查看更多
            游戏推荐
            推荐专题
            热门阅读
            推荐下载