0

0

C# 程序集加载方法 C#如何使用Assembly.LoadFile加载DLL

畫卷琴夢

畫卷琴夢

发布时间:2026-01-25 10:59:56

|

212人浏览过

|

来源于php中文网

原创

Assembly.LoadFile仅按绝对路径加载DLL,不解析依赖、不查GAC、不参与绑定上下文,每次调用返回新实例;适合临时独立库,但需手动加载所有依赖,否则易现FileNotFoundException或InvalidCastException。

c# 程序集加载方法 c#如何使用assembly.loadfile加载dll

Assembly.LoadFile 会绕过 GAC 和绑定上下文,只按路径加载

Assembly.LoadFile 是最“直白”的加载方式:它不走 .NET 的程序集解析流程(比如不查 GAC、不触发 AssemblyResolve 事件、不参与当前 AssemblyLoadContext 的依赖管理),纯粹根据你传入的完整文件路径读取并加载 DLL 到当前进程。这意味着它适合临时加载一个独立工具库,但不适合用于有强依赖关系的模块。

常见错误现象:FileNotFoundException 明明文件存在却报找不到;或后续调用类型时抛 InvalidCastExceptionMethodAccessException —— 很可能是因为依赖的其他 DLL 没被自动加载,或同名类型在不同上下文中重复定义。

  • 必须传入绝对路径,相对路径会被解释为相对于当前工作目录(Environment.CurrentDirectory),不是程序集所在目录
  • 多次调用 Assembly.LoadFile 加载同一个文件,会返回不同的 Assembly 实例(不会去重)
  • 加载后无法通过 Assembly.GetExecutingAssembly()typeof(X).Assembly 反向获取它——它不在默认上下文中

LoadFile 和 LoadFrom 的关键区别在哪

很多人误以为 Assembly.LoadFrom 只是“带缓存版”的 LoadFile,其实二者语义完全不同:

  • Assembly.LoadFile(@"C:\lib\Utils.dll"):只加载该文件,不尝试解析或加载它的任何依赖项(哪怕这些依赖就在同一目录下)
  • Assembly.LoadFrom(@"C:\lib\Utils.dll"):会将该路径加入探测路径(probe path),后续若该程序集内部引用了 Newtonsoft.Json.dll,且该 DLL 在同一目录,.NET 会自动加载它
  • LoadFrom 同一路径只会加载一次(返回已加载实例),LoadFile 每次都新建实例

所以如果你的 DLL 依赖其他本地 DLL,别用 LoadFile —— 它不会帮你“顺手带上”,你得手动用 LoadFileLoadFrom 把每个依赖都显式加载一遍,顺序还得对(先加载依赖,再加载主程序集)。

如何安全地从字节数组或嵌入资源加载 DLL

如果你把 DLL 作为嵌入资源打包进主程序,不能直接用 LoadFile(它只接受路径)。此时应改用 Assembly.Load(byte[])

e网企业2.0
e网企业2.0

一款适用于中小企业自助建站程序,是c#与xml技术相结合的产物,支持动态设定二级栏目,采用了开放式架构,建站模版自由添加。程序整合了(单一文本,新闻列表,图片列表 ,在线订单, 文件下载 , 留言板)六类插件,以所见即所得的方式,将烦锁的建站过程简化到三步,使用户可以轻松上手。 管理后台:manage.aspx 初始密码均为admin

下载
var bytes = Properties.Resources.MyPlugin;
var asm = Assembly.Load(bytes);

注意:Assembly.Load(byte[]) 加载的是“纯 IL 字节”,它会走标准绑定流程(如检查 GAC、触发 AssemblyResolve),且生成的程序集属于当前 AssemblyLoadContext。这和 LoadFile 的隔离性完全相反。

  • 嵌入资源需设为 Embedded Resource,不是 Resource
  • 如果 DLL 本身有强名称(strong-named),而你的主程序没启用 loadFromRemoteSources,可能因安全策略被拒
  • 避免在 AppDomain.AssemblyLoad 事件里再调用 Load 类方法,容易引发死锁或循环加载

加载后怎么调用其中的类和方法

加载成功只是第一步。由于 LoadFile 返回的程序集不在默认上下文中,你不能直接写 new MyPlugin.ClassA() —— 编译器根本不知道这个类型。

必须用反射:

var asm = Assembly.LoadFile(@"C:\lib\MyPlugin.dll");
var type = asm.GetType("MyPlugin.ClassA");
var instance = Activator.CreateInstance(type);
var method = type.GetMethod("DoWork");
method.Invoke(instance, null);
  • 类型全名(GetType 参数)必须包含命名空间,不能只写类名
  • 如果目标类有构造函数参数,Activator.CreateInstance 第二个参数要传 object[]
  • 建议用 type.GetCustomAttribute() 先校验类型是否符合预期契约,而不是等到 Invoke 才崩

真正麻烦的不是加载,而是跨上下文的类型转换和生命周期管理——比如你从 LoadFile 加载的程序集里 new 出的对象,传给主程序时若涉及接口实现,必须确保接口定义在双方都能访问的共享程序集中,否则就是两个“同名不同源”的类型,强制转换必失败。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

417

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

152

2023.12.20

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1072

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

913

2025.12.29

c++ 根号
c++ 根号

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

41

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.5万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

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

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