关于c#动态加载程序集的一些注意事项

Assembly下有LoadFile,LoadFrom等方法可以加载程序集。

LoadFile只加载你给定路径的那个dll,LoadFrom会自动加载依赖的dll。

如:A依赖B,LoadFile(“A”)只会加载A,不会加载B,之后运行A的方法可能会导致报错。

LoadFrom(“A”)则会自动加载A和A的依赖,之后调用就不会报错了

但是如果想要加载进来的程序集还能够卸载掉,就不能用这样的方法了。

需要用到AppDomain.CreateDomain这样的sandbox型的方法,在之后,再把Create出来的这个AppDomain,Unload掉

首先,需要继承MarshalByRefObject写一个类

在此类中写一个Load方法

public class Sandbox : MarshalByRefObject
{
    public void Load(string path)
    {
        Assembly.LoadFrom(path);
    }
}
之后,在住程序中
var ad = AppDomain.CreateDomain("new");
Sandbox sandbox = (Sandbox)ad.CreateInstanceFromAndUnwrap(@"sandbox所在程序集", "命名空间.Sandbox");
sandbox.Load(path);

此时,主程序域中,并没有任何你刚刚加载进来的程序集信息,如果需要调用里面的方法,你同样需要通过sandbox去调用。

所以sandbox可以增加调用的方法。只有在sandbox中,才能访问当相关的程序集信息。

 

最后使用

AppDomain.Unload(ad);
卸载掉

posted @ 2015-09-14 17:26  czcz1024  阅读(764)  评论(0编辑  收藏  举报