平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“.NET 引用两个不同版本的dll的几种做法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
实际处理时,在.NET中引用两个不同版本的DLL是一个常用的需求,特别是在处理依赖冲突或逐步升级时。以下是几种解决方案:
这是最常用的方法,允许你在同一个项目中引用两个不同版本的DLL。
Version1 和 Version2)// 在文件顶部定义外部别名
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(); // 使用默认引用
}
}
在 app.config 或 web.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>
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();
}
}
为每个版本新建独立的包装器:
// 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");
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);
}
}
选择哪种方法取决于你的具体需求、应用程序架构和部署环境。
到此这篇关于.NET 引用两个不同版本的dll的几种方法的文章就介绍到这了,更多相关.NET 引用不同版本dll内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!
TPLink TLWR847N 51~53 无线路由器修改WiFi名称及密码方法
TPLink TLWR847N 51~53 无线路由器映射服务器到外网操作指南
TPLink TLWR847N 51~53 无线路由器当做交换机(无线AP)使用设置
如何编写高质量的前端代码(快手电商前端前端代码规范)实用指南
在Linux系统上安装部署Oracle Database保姆级教程实用指南
关于Dart中的异步编程实用指南