如何使用反射动态加载程序集
在C#中,我们可以使用反射Reflection来动态加载程序集。动态加载程序集是一种在运行时根据需要加载程序集的技术,而不是在编译时将其硬编码到应用程序中。
应用场景具体:为应用程序开发自定义插件。在应用程序中,我们可以使用反射来动态加载插件程序集,然后使用插件中的类型。
比如有如下的程序集:
namespace DynamicLoadAndExecute.Library
{
public class Dog
{
public void Speak(string? name)
{
System.Console.WriteLine($"Woof... {name}");
}
}
}
要动态加载程序集,我们需要使用Assembly类和Type类。
- 使用Assembly.Load方法加载程序集。这个方法接受程序集的名称作为参数,并返回一个Assembly对象,表示已加载的程序集。
Assembly assembly = Assembly.Load("DynamicLoadAndExecute.Library");
- 使用Assembly.GetType方法获取程序集中的类型。这个方法接受类型的名称作为参数,并返回一个Type对象,表示已加载的类型。
Type type = assembly.GetType("DynamicLoadAndExecute.Library.Dog");
- 使用Type.GetMethod方法获取类型中的方法。这个方法接受方法的名称作为参数,并返回一个MethodInfo对象,表示已加载的方法。
MethodInfo methodInfo = type.GetMethod("Speak");
- 使用Activator.CreateInstance方法创建对象实例。这个方法接受类型的名称作为参数,并返回一个object对象,表示已创建的对象实例。使用MethodInfo.Invoke调用方法。这个方法接受对象实例和方法参数作为参数,并返回一个object对象,表示方法的返回值。
object? dogInstance = Activator.CreateInstance(type);
methodInfo.Invoke(dogInstance, new object?[] { "Buddy" });