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