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

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

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[])

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 出的对象,传给主程序时若涉及接口实现,必须确保接口定义在双方都能访问的共享程序集中,否则就是两个“同名不同源”的类型,强制转换必失败。


# js  # json  # app  # 字节  # access  # 工具  # ai  # 区别  # c#  # .net  # Object  # Resource  # 命名空间  # 构造函数  # 循环  # 接口  # 类型转换  # 对象  # 事件  # typeof  # 加载  # 主程序  # 绑定  # 死锁  # 的是  # 自动加载  # 不查  # 是因为  # 都能  # 找不到 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel怎么为数据库表字段添加索引以优化查询  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  专业商城网站制作公司有哪些,pi商城官网是哪个?  Python面向对象测试方法_mock解析【教程】  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何用好域名打造高点击率的自主建站?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel如何使用模型观察者?(Observer代码示例)  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  javascript中闭包概念与用法深入理解  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  微信小程序 wx.uploadFile无法上传解决办法  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  使用C语言编写圣诞表白程序  Laravel如何使用withoutEvents方法临时禁用模型事件  如何快速生成凡客建站的专业级图册?  高性价比服务器租赁——企业级配置与24小时运维服务  Mybatis 中的insertOrUpdate操作  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  如何在阿里云通过域名搭建网站?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何快速启动建站代理加盟业务?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  简单实现Android验证码  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何将凡科建站内容保存为本地文件?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  C语言设计一个闪闪的圣诞树  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  动图在线制作网站有哪些,滑动动图图集怎么做?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  网站制作壁纸教程视频,电脑壁纸网站?  原生JS获取元素集合的子元素宽度实例  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  javascript基于原型链的继承及call和apply函数用法分析  浅谈Javascript中的Label语句  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel如何使用Sanctum进行API认证?(SPA实战)  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  bootstrap日历插件datetimepicker使用方法  EditPlus中的正则表达式 实战(2)  ,南京靠谱的征婚网站?