C# .Net 动态加载版本不同引用不同的程序集.

在C# .NET中,动态加载不同版本的程序集(DLL)是一个高级的操作,通常用于插件架构或需要在运行时加载不同版本库的应用程序。可以通过反射和 AssemblyLoadContext(.NET Core 和 .NET 5/6/7+ 中的特性)来实现。以下是详细的步骤和示例代码。

1. 使用反射动态加载程序集

对于.NET Framework,可以使用反射来动态加载和使用程序集。这里是一个基本示例:

csharp
using System; using System.Reflection; class Program { static void Main() { // 程序集路径 string assemblyPath = @"path\to\your\assembly.dll"; // 动态加载程序集 Assembly assembly = Assembly.LoadFrom(assemblyPath); // 获取类型 Type type = assembly.GetType("Namespace.ClassName"); // 创建对象 object instance = Activator.CreateInstance(type); // 调用方法 MethodInfo method = type.GetMethod("MethodName"); method.Invoke(instance, new object[] { /* method parameters */ }); } }

2. 使用 AssemblyLoadContext (.NET Core 和 .NET 5/6/7+)

在.NET Core 或 .NET 5/6/7+ 中,可以使用 AssemblyLoadContext 来加载和卸载程序集:

csharp
using System; using System.Reflection; using System.Runtime.Loader; public class DynamicAssemblyLoader : AssemblyLoadContext { public DynamicAssemblyLoader() : base(isCollectible: true) { } public Assembly LoadAssembly(string assemblyPath) { return LoadFromAssemblyPath(assemblyPath); } } class Program { static void Main() { string assemblyPathV1 = @"path\to\your\assembly_v1.dll"; string assemblyPathV2 = @"path\to\your\assembly_v2.dll"; // 创建自定义 AssemblyLoadContext 实例 var loaderV1 = new DynamicAssemblyLoader(); var loaderV2 = new DynamicAssemblyLoader(); // 动态加载不同版本的程序集 Assembly assemblyV1 = loaderV1.LoadAssembly(assemblyPathV1); Assembly assemblyV2 = loaderV2.LoadAssembly(assemblyPathV2); // 使用版本1的程序集 Type typeV1 = assemblyV1.GetType("Namespace.ClassName"); object instanceV1 = Activator.CreateInstance(typeV1); MethodInfo methodV1 = typeV1.GetMethod("MethodName"); methodV1.Invoke(instanceV1, new object[] { /* method parameters */ }); // 使用版本2的程序集 Type typeV2 = assemblyV2.GetType("Namespace.ClassName"); object instanceV2 = Activator.CreateInstance(typeV2); MethodInfo methodV2 = typeV2.GetMethod("MethodName"); methodV2.Invoke(instanceV2, new object[] { /* method parameters */ }); } }

3. 注意事项

  1. 路径和版本管理

    • 确保你正确管理程序集的路径和版本号,以避免版本冲突或路径错误。
  2. 程序集冲突

    • 在同一个应用程序域中,程序集可能会因为名称相同但版本不同而发生冲突。使用不同的 AssemblyLoadContext 可以避免这种问题。
  3. 卸载程序集

    • 在.NET Core 和 .NET 5/6/7+ 中,可以通过 AssemblyLoadContext 实现程序集的卸载,避免内存泄漏。
  4. 权限和安全

    • 动态加载程序集可能涉及到安全和权限问题,确保你从受信任的源加载程序集,并在加载过程中进行适当的安全检查。

总结

在C# .NET中动态加载不同版本的程序集可以通过反射或 AssemblyLoadContext 实现。使用反射适用于.NET Framework,而使用 AssemblyLoadContext 适用于.NET Core 和 .NET 5/6/7+。这些方法允许在运行时根据需求加载不同版本的程序集,并避免版本冲突和内存泄漏。

关键字

C#, .NET, 动态加载, 程序集, 版本管理, 反射, AssemblyLoadContext, 程序集冲突, 卸载程序集, 安全检查