好久没写什么了,最近项目遇到一要求,为开发方便,需要wcf 服务能动态加载。这本不是什么难事,反射内存加载大家都会。
不管程序集在那个地方,但是,请不要放在loader目录下。
但是,如果遇到引用DLL?如何卸载被引用的程序集,基本上陷入困境。
网上资料无非 appdomain能解决。但是,不算性能损失,调用方式不便。
这种繁琐的解决方案,估计也不会经常在项目中实施,除非非它不可。
当然,一开始就注重设计,引入工厂容器进行对象管理之类项目排除。
这里,我们来演示一个小小的项目,或许,对你有所帮助。
首先要说的是:AssemblyResolve
当你尝试用Assembly.Load载入一个程序集,并且尝试运行其中方法的时候。如果遇到引用另外一个程序集的情况下,AssemblyResolve就出场了。
你可以像这样使用它。
static List<Assembly> AssemblyList = new List<Assembly>();
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
foreach (var item in AssemblyList)
{
if (item.ToString() == args.Name)
{
return item;
}
}
return null;
}
不管程序集在那个地方,但是,请不要放在loader目录下。
首先,要做的是重定向程序集,这一步我们已经做完了。(下面砸鸡蛋,下去,这么菜的。。。。,顶住压力楼主继续。。。)
好吧,然后是关于程序集锁定的问题,像这样:
AssemblyList.Add(Assembly.Load( System.IO.File.ReadAllBytes(item.FullName)));
以下是伪代码,不一定能跑,大家看那么个意思。
DLL A:
public class ClassA
{
public ClassA()
{