0

0

C#动态加载DLL文件 C#如何从指定路径加载程序集并执行代码

月夜之吻

月夜之吻

发布时间:2026-02-10 09:27:10

|

789人浏览过

|

来源于php中文网

原创

应优先使用可回收的 AssemblyLoadContext 加载 DLL:创建 isCollectible=true 的上下文,调用 LoadFromAssemblyPath 加载,反射调用后执行 Unload 卸载;.NET Framework 中 Assembly.LoadFrom 不可卸载且易冲突,跨框架需运行时检测并谨慎回退。

c#动态加载dll文件 c#如何从指定路径加载程序集并执行代码

AssemblyLoadContext 加载 DLL(.NET Core / .NET 5+ 推荐)

在 .NET Core 及更高版本中,Assembly.LoadFrom 已不推荐用于动态加载,因为它会将程序集加载进默认上下文,无法卸载,容易引发内存泄漏或类型冲突。应优先使用 AssemblyLoadContext 的隔离实例。

  • 创建派生自 AssemblyLoadContext 的子类,并重写 Load 方法(如需自定义解析依赖)
  • new AssemblyLoadContext(isCollectible: true) 构造可回收上下文
  • 调用 context.LoadFromAssemblyPath(path) 加载 DLL
  • 通过反射获取类型、创建实例、调用方法后,可调用 context.Unload()(注意:需 .NET 5+,且所有对该程序集的引用必须已释放)

示例关键片段:

var context = new AssemblyLoadContext(isCollectible: true);
var asm = context.LoadFromAssemblyPath(@"C:\plugins\MyPlugin.dll");
var type = asm.GetType("MyPlugin.Processor");
var instance = Activator.CreateInstance(type);
type.GetMethod("Run").Invoke(instance, null);
context.Unload(); // 不会立即卸载,但标记为可回收

Assembly.LoadFrom 在 .NET Framework 中仍可用,但有陷阱

Assembly.LoadFrom 在 .NET Framework 下能快速加载,但它会自动解析并加载同目录下的依赖项,且一旦加载进默认上下文,就无法卸载——哪怕你不再持有任何引用。

  • 若多次调用 Assembly.LoadFrom 加载同一路径的 DLL,返回的是缓存中的同一个 Assembly 实例(不是新加载)
  • 若 DLL 依赖其他未 GAC 的程序集,而它们不在当前应用目录或 probing path 中,会抛出 FileNotFoundException(错误信息里是“未能加载文件或程序集”,不是具体缺失的依赖名)
  • 不能用于加载与当前程序集同名但不同版本的 DLL(会直接返回已加载的版本)

调试建议:启用 Fusion Log(fuslogvw.exe)查看实际绑定过程,定位缺失依赖。

跨框架兼容写法:用 AssemblyLoadContext.Default.LoadFromAssemblyPath(.NET 5+)或回退到 Assembly.LoadFile(慎用)

如果项目需同时支持 .NET Framework 和 .NET 5+,不能无脑用 LoadFromAssemblyPath(.NET Framework 没这个 API)。但要注意:Assembly.LoadFile 是危险选项——它绕过上下文和探测逻辑,加载的程序集无法解析其依赖(除非手动处理 AppDomain.CurrentDomain.AssemblyResolve),极易失败。

MakeSong
MakeSong

AI音乐生成,生成高质量音乐,仅需30秒的时间

下载
  • 优先检测运行时:RuntimeInformation.FrameworkDescriptiontypeof(AssemblyLoadContext).IsAvailable
  • .NET 5+:走 AssemblyLoadContext.Default.LoadFromAssemblyPath(path)(不可卸载,但兼容简单场景)
  • .NET Framework:仅当确认无依赖或依赖已全局加载时,才用 Assembly.LoadFrom(path);否则必须自己实现 AssemblyResolve 事件来补全依赖查找逻辑

特别注意:LoadFile 加载的类型与主程序集中同名类型不兼容(即使代码完全一样),做 is 判断或强制转型会失败。

执行前必须验证程序集签名、目标框架和入口点

用户提供的 DLL 往往未经信任,直接 Load 可能引发安全或兼容性问题。不要跳过校验步骤。

  • AssemblyName.GetAssemblyName(path) 提前读取元数据,检查 GetReferencedAssemblies() 是否包含危险项(如 System.Drawing 在 Linux 上不可用)
  • 检查 AssemblyName.VersionAssemblyName.ProcessorArchitecture 是否匹配宿主环境
  • 确认导出类型有无无参公共构造函数,方法是否为 public 且非 static(若用 Activator.CreateInstance
  • 若执行的是 Main 方法,注意其签名必须是 void Main(string[] args)int Main(string[] args),且类型需标记为 [STAThread] 等属性(如需 UI)

最易忽略的一点:DLL 若含 NativeAOTTrimmed 元数据,可能在反射调用时因裁剪丢失成员而静默失败——务必在构建插件时禁用 trimming 或保留必要反射入口。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

555

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

205

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

107

2025.11.27

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

132

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 16.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号