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就很可靠。
