关于c#动态加载程序集的一些注意事项
2015-09-14 17:26
513 查看
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方法
此时,主程序域中,并没有任何你刚刚加载进来的程序集信息,如果需要调用里面的方法,你同样需要通过sandbox去调用。
所以sandbox可以增加调用的方法。只有在sandbox中,才能访问当相关的程序集信息。
最后使用
卸载掉
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);
卸载掉
相关文章推荐
- 【转】C# Serializable对象序列化的作用
- Emgu入门引导——加载并显示图像(C#风格)
- C# 下实现把Array复制到ArrayList中的四种方法
- C# 将RichTextBox中内容的文档以二进制形式存
- C#异常处理的几个原则
- C# 对象销毁和垃圾回收
- C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- C# Winform MDI窗体,父窗体控件覆盖子窗体的解决办法
- c#修改本地连接工具 ip地址,dns,网关,子网掩码
- C#winform修改IP,dns
- C#读取Xml中出现”&”等特殊符号
- c#对csv的读写
- C#线程访问winform窗体控件
- 1.C# 的内置引用类型
- MFC窗口风格 说明及在c#中的定义使用
- C#中ComboBox的SelectedIndexChanged事件获取Tag值
- .NET创建Windows服务详细步骤(C#)
- C# 从服务器下载文件代码
- c#比较两个字符串
- VS C#程序打包覆盖安装不能更新的解决方法