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

来源:这里教程网 时间:2026-02-21 17:36:06 作者:

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

相关推荐