12人参与 • 2025-09-07 • Asp.net
在 c# 中,动态加载程序集(dynamic assembly loading)是一种常见的需求,特别是在需要模块化、插件化或运行时扩展功能的场景中。以下是如何实现 c# 代码依赖的动态加载的详细说明,结合了知识库中的关键信息和实际应用技巧。
c# 提供了多种方式动态加载程序集,以下是三种常用方法及其区别:
assembly assembly = assembly.load("myassembly");
assembly assembly = assembly.loadfrom("c:\\myassembly.dll");
appdomain.assemblyresolve
事件)。assembly assembly = assembly.loadfile("c:\\myassembly.dll");
以下是一个完整的动态加载程序集并调用其功能的示例:
string path = @"c:\myassembly.dll"; assembly assembly = assembly.loadfile(path);
// 获取类型(需指定命名空间和类名) type type = assembly.gettype("mynamespace.myclass"); // 创建实例(无参构造函数) object instance = activator.createinstance(type);
// 获取方法信息 methodinfo method = type.getmethod("mymethod"); // 调用方法(无参) method.invoke(instance, null);
如果程序集依赖其他 dll,需通过 appdomain.assemblyresolve
事件手动加载依赖项:
appdomain.currentdomain.assemblyresolve += (sender, args) => { string dependencypath = @"c:\mydependency.dll"; return file.exists(dependencypath) ? assembly.loadfile(dependencypath) : null; };
通过动态加载外部 dll 实现模块化扩展:
// 加载插件 assembly pluginassembly = assembly.loadfrom("plugin.dll"); // 查找所有实现 iplugin 接口的类型 foreach (type type in pluginassembly.gettypes()) { if (typeof(iplugin).isassignablefrom(type) && !type.isinterface) { iplugin plugin = (iplugin)activator.createinstance(type); plugin.execute(); } }
根据用户配置动态加载功能模块:
string modulename = "modulea"; assembly moduleassembly = assembly.load(modulename); type moduletype = moduleassembly.gettype($"{modulename}.moduleclass"); object moduleinstance = activator.createinstance(moduletype);
动态加载资源文件(如语言包):
assembly resourceassembly = assembly.load("resources"); resourcemanager rm = new resourcemanager("myresources", resourceassembly); string localizedtext = rm.getstring("welcomemessage");
loadfrom
:适合大多数场景,依赖项会自动加载(需确保依赖项在路径中)。loadfile
:需手动处理依赖项,适合需要隔离加载或加载多个同名程序集的场景。appdomain
隔离加载程序集,限制其权限(如沙箱环境)。methodinfo
、constructorinfo
等反射对象,避免频繁反射调用。system.linq.expressions
生成委托代替 invoke
。c# 中无法直接卸载单个程序集,需通过卸载整个 appdomain
实现:
// 创建新 appdomain 并加载程序集 appdomain domain = appdomain.createdomain("plugindomain"); domain.load("myassembly"); // 卸载 appdomain 以释放程序集 appdomain.unload(domain);
using system; using system.io; using system.reflection; class program { static void main() { // 注册依赖项加载事件 appdomain.currentdomain.assemblyresolve += currentdomain_assemblyresolve; // 动态加载主程序集 string maindllpath = @"c:\mainassembly.dll"; assembly mainassembly = assembly.loadfile(maindllpath); // 获取类型并创建实例 type maintype = mainassembly.gettype("mainnamespace.mainclass"); object maininstance = activator.createinstance(maintype); // 调用方法 methodinfo method = maintype.getmethod("run"); method.invoke(maininstance, null); } private static assembly currentdomain_assemblyresolve(object sender, resolveeventargs args) { // 手动加载依赖项 string dependencypath = path.combine(@"c:\dependencies", new assemblyname(args.name).name + ".dll"); return file.exists(dependencypath) ? assembly.loadfile(dependencypath) : null; } }
动态加载程序集是 c# 实现灵活架构的关键技术,适用于插件系统、模块化设计和运行时扩展等场景。通过合理选择 assembly.load
、loadfrom
或 loadfile
,结合依赖项管理和性能优化,可以高效实现动态加载需求。同时,需注意安全性和资源隔离,确保应用程序的稳定性和可控性。
以上就是c#动态加载程序集的全攻略的详细内容,更多关于c#动态加载程序集的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论