如何在同一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(看个人习惯)
- 给foobar.dll v11设置别名:
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
相关产品推荐
相关产品推荐

