C# 如何正确的加载DLL和动态调用方法

2021-06-09  乐帮网

c#

在C#中当我们想使用动态反射调用时一般会写如下的方法来实现:前提条件是必须在本项目引用定义接口 "IRunnable"。

var asm = Assembly.LoadFile(@"C:\myDll.dll");
var type = asm.GetType("TestRunner");
var runnable = Activator.CreateInstance(type) as IRunnable;
if (runnable == null) throw new Exception("broke");
runnable.Run();

但是我想说的是以上并不是最优方法,为什么呢?在类型隔离性这样使用是有问题的,可能会造成冲突。正确的使用方法是引入 AppDomain,这样代码就改为如下:

var domain = AppDomain.CreateDomain("NewDomainName");
var t = typeof(TypeIWantToLoad);
var runnable = domain.CreateInstanceFromAndUnwrap(@"C:\myDll.dll", t.Name) as IRunnable;
if (runnable == null) throw new Exception("broke");
runnable.Run();

这样写的好处显而易见,一是容器隔离开了,配置也分开了,类型相互也不影响,二是它可以卸载了,灵活性大大增加了。但是还有一个问题必须说明,当存引入多个dll时,必须全部都加载进来再反射运行方法,否则你会得到一个错误。

 

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:xinsiyu6@gmail.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力