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

Assembly.LoadFile 是 C# 中用于从指定文件路径动态加载程序集(.dll 或 .exe)的方法,它会将程序集加载到当前上下文(LoadContext),但**不会自动解析其依赖项**——这是使用时最容易出错的关键点。
基本用法:加载并创建类型实例
假设你有一个外部类库 MyPlugin.dll,其中包含一个公开类 MyPlugin.Service:
- 先确保该 DLL 文件路径可访问(如放在程序同目录或绝对路径)
- 调用
Assembly.LoadFile(path)获取程序集对象 - 用
assembly.GetType("FullName")获取类型,再通过Activator.CreateInstance创建实例
string dllPath = @"C:\Plugins\MyPlugin.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)。如果缺失依赖,运行时会抛出 FileNotFoundException 或 FileLoadException。
- 解决方案一:把所有依赖 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 就很可靠。










