You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一C#项目中使用同一DLL的两个不兼容版本?

在同一csproj中同时使用foobar.dll的11版和12版

这种版本不兼容且需要共存的场景,我之前处理过类似的问题,在C#里可以通过**程序集别名(Assembly Aliases)**完美解决,具体操作步骤如下:

1. 添加引用并设置别名

首先把两个版本的DLL区分路径添加到项目中,避免文件覆盖:

  • 将foobar.dll v11放在项目下的lib/foobar-v11文件夹,foobar.dll v12和foobarPlugin.dll放在lib/foobar-v12文件夹
  • 分别添加这三个DLL的引用,然后在每个引用的属性窗口里修改Aliases属性:
    • 给foobar.dll v11设置别名:FoobarV11
    • 给foobar.dll v12设置别名:FoobarV12
    • foobarPlugin.dll可以保持默认别名global,也可以自定义为FoobarPluginV12(看个人习惯)

2. 在代码中通过别名区分版本

在依赖不同版本的类文件顶部,用extern alias声明要使用的别名,然后通过别名前缀调用对应版本的类型:

依赖v11的类示例

// 声明要使用v11的程序集别名
extern alias FoobarV11;

namespace MyProject.LegacyServices
{
    public class LegacyDataProcessor
    {
        public void HandleLegacyLogic()
        {
            // 通过别名前缀调用v11版本的A和B
            var aInstance = new FoobarV11::Foobar.A();
            var bInstance = new FoobarV11::Foobar.B();
            
            // 编写你的业务逻辑
        }
    }
}

依赖v12的类示例

// 声明要使用v12的程序集别名
extern alias FoobarV12;

namespace MyProject.NewServices
{
    public class NewDataProcessor
    {
        public void HandleNewLogic()
        {
            // 通过别名前缀调用v12版本的A
            var aInstance = new FoobarV12::Foobar.A();
            // 直接调用foobarPlugin.dll中的B(默认别名下用其命名空间即可)
            var bInstance = new FoobarPlugin.B();
            
            // 编写你的业务逻辑
        }
    }
}

3. 额外注意事项

  • 如果是通过NuGet获取的DLL,建议手动下载NuGet包解压后再引用,因为NuGet默认会自动覆盖同名程序集,无法同时保留两个版本
  • 编译时若出现类型冲突错误,先检查extern alias语句是否正确,以及引用的别名和代码中的是否一致
  • 尽量把依赖不同版本的代码放在不同命名空间下,避免代码混淆

内容的提问来源于stack exchange,提问作者Chiquelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:07:01