优秀的编程知识分享平台

网站首页 > 技术文章 正文

C#反射加载DLL教程(c# 反射dll)

nanyue 2024-08-26 18:08:43 技术文章 5 ℃

在C#中,使用反射加载DLL通常涉及以下步骤:

  1. 确定DLL的位置
  • 你需要知道DLL文件的完整路径。这可以是相对路径或绝对路径。
  1. 使用Assembly.Load或Assembly.LoadFrom加载DLL:
  • Assembly.Load用于从程序集缓存加载程序集,前提是该程序集已经在应用程序域中加载过。
  • Assembly.LoadFrom用于从指定的路径加载程序集。
  1. 获取类型信息
  • 使用Assembly对象的GetType方法获取DLL中的类型信息。如果DLL中有多个命名空间,你可能需要指定完整的类型名称,包括命名空间和类名。
  1. 创建类型的实例
  • 使用Activator.CreateInstance方法创建类型的实例。如果类型有构造函数参数,需要提供相应的参数。
  1. 调用方法或访问属性和字段
  • 使用MethodInfo.Invoke方法调用实例上的方法。
  • 使用PropertyInfo.GetValue和PropertyInfo.SetValue方法读取或设置实例的属性值。
  • 使用FieldInfo.GetValue和FieldInfo.SetValue方法读取或设置实例的字段值。
  1. 处理异常
  • 反射操作可能会抛出多种异常,如FileNotFoundException(如果找不到DLL)、ReflectionTypeLoadException(如果无法加载类型)等。你应该准备好相应的异常处理代码。
  1. 卸载程序集
  • 如果你不再需要DLL中的类型,可以使用Assembly.Unload方法卸载整个程序集。这通常用于动态加载和卸载DLL的场景。

下面是一个示例代码,展示了如何使用反射加载DLL并调用其中的方法:

using System;
using System.IO;
using System.Reflection;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            // 指定DLL文件的路径
            string dllPath = @"C:\path\to\your\assembly.dll";

            // 使用Assembly.LoadFrom加载DLL
            Assembly assembly = Assembly.LoadFrom(dllPath);

            // 获取DLL中的类型
            Type type = assembly.GetType("Namespace.ClassName");

            if (type == null)
            {
                throw new InvalidOperationException("Type not found in the DLL.");
            }

            // 创建类型的实例
            object instance = Activator.CreateInstance(type);

            // 获取方法信息
            MethodInfo methodInfo = type.GetMethod("MethodName");

            if (methodInfo == null)
            {
                throw new InvalidOperationException("Method not found in the type.");
            }

            // 调用实例上的方法
            methodInfo.Invoke(instance, new object[] { /* 方法参数 */ });

            // 如果方法有返回值,可以这样获取
            // object result = methodInfo.Invoke(instance, new object[] { /* 方法参数 */ });
            // Console.WriteLine(result);

            // 卸载程序集(如果需要)
            // assembly.Unload();
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine(#34;DLL not found: {ex.Message}");
        }
        catch (ReflectionTypeLoadException ex)
        {
            Console.WriteLine("Failed to load type from DLL.");
            foreach (Exception exSub in ex.TypesResolved)
            {
                Console.WriteLine(#34;Sub-exception: {exSub.Message}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(#34;An error occurred: {ex.Message}");
        }
    }
}

在这个示例中,我们首先指定了DLL文件的路径,然后使用Assembly.LoadFrom方法加载了DLL。接着,我们使用GetType方法获取了DLL中的特定类型。一旦获得了类型信息,我们就可以使用Activator.CreateInstance方法创建类型的实例。最后,我们使用MethodInfo.Invoke方法调用实例上的方法。

请注意,在实际应用中,你可能需要处理更复杂的情况,例如处理方法的重载、泛型方法、静态方法等。此外,如果DLL依赖于其他未加载的程序集,你可能还需要使用AppDomain.AssemblyResolve事件来解决程序集解析问题。

最近发表
标签列表