C#怎么动态加载程序集 Assembly.LoadFile使用方法

15次阅读

Assembly.LoadFile 是 C# 中按文件路径动态加载程序集的方法,但不会自动解析依赖项;需手动处理依赖,如放置于 bin 目录、订阅 AssemblyResolve 事件或改用 AssemblyLoadContext。

C#怎么动态加载程序集 Assembly.LoadFile使用方法

Assembly.LoadFile 是 C# 中用于从指定文件路径动态加载程序集(.dll 或 .exe)的方法,它会将程序集加载到当前上下文(LoadContext),但**不会自动解析其依赖项**——这是使用时最容易出错的关键点。

基本用法:加载并创建类型实例

假设你有一个外部类库 MyPlugin.dll,其中包含一个公开类 MyPlugin.Service

  • 先确保该 DLL 文件路径可访问(如放在程序同目录或绝对路径)
  • 调用 Assembly.LoadFile(path) 获取程序集对象
  • assembly.GetType("FullName") 获取类型,再通过 Activator.CreateInstance 创建实例

示例代码:

string dllPath = @"C:PluginsMyPlugin.dll"; Assembly assembly = Assembly.LoadFile(dllPath); Type serviceType = assembly.GetType("MyPlugin.Service"); object instance = Activator.CreateInstance(serviceType); // 调用方法(需反射或接口约定) serviceType.GetMethod("DoWork").Invoke(instance, null);

⚠️ 注意依赖项不会自动加载

LoadFile 只加载指定文件,不处理它引用的其他程序集(比如它依赖 Newtonsoft.json.dll)。如果缺失依赖,运行时会抛出 FileNotFoundExceptionFileLoadException

  • 解决方案一:把所有依赖 DLL 放到主程序的 bin 目录(让默认 AssemblyResolve 机制找到)
  • 解决方案二:订阅 appDomain.CurrentDomain.AssemblyResolve 事件,手动返回依赖程序集
  • 解决方案三(推荐.net Core/.NET 5+):改用 AssemblyLoadContext.LoadFromAssemblyPath,更可控且支持隔离

和 LoadFrom、Load 的区别要点

  • LoadFile:按文件路径加载,不考虑 GAC 或加载上下文策略;同一程序集多次调用会重复加载(不同 Assembly 实例)
  • LoadFrom:也按路径加载,但会触发上下文绑定,可能复用已加载的程序集,且会尝试解析依赖(行为较复杂)
  • Load:按 AssemblyName 加载,走 GAC / bin / probing path,无法直接指定任意磁盘路径

安全与实用建议

  • 不要对不可信来源的 DLL 使用 LoadFile(存在代码执行风险)
  • 生产环境建议配合接口抽象(如定义 IPlugin 在主程序中),用强类型交互替代纯反射
  • .NET 5+ 推荐迁移到 AssemblyLoadContext,支持卸载(Unload),避免内存泄漏
  • 调试时可用 assembly.GetReferencedAssemblies() 查看它依赖哪些程序集

基本上就这些。用对场景、管好依赖、注意上下文,LoadFile 就很可靠。

text=ZqhQzanResources