[转]C#动态加载/卸载Assembly的解决方案
2008-11-30 03:10
260 查看
1. Assembly中的类要从MarshalByRefObject继承,如果你想从你自己的类来继承,那么请选用interface或者继续研究其他解决方案。
namespace Library
public object InvokeMethod(string name, object obj, object[] paras)
public object InvokeInstanceMethodNotCachedAsm(string name, string assemblyFile, string typeName, object[] paras)
甚至还可以采取将Assembly缓存的机制,这样调用起来速度更快。
3.
调用程序中加载和卸载AppDomain:
static void Load()
static void Unload()
...{
AppDomain.Unload(appDomain);
}
在这里,有三点是关键,一是创建一个新的AppDomain,二是让这个新的AppDomain允许使用影像副本文件,三是要把影像副本目录设为非主程序所在文件夹。
这是因为.Net不允许卸载一个已加载的Assembly,除非卸载整个AppDomain,允许使用影像副本,.Net就把要加载的Assembly复制到另一个文件夹(在用户配置文件夹中),但程序所在文件夹中的Assembly并不被复制。
4.创建对象实例
object obj = appDomain.CreateInstanceFromAndUnwrap("Assembly文件名含路径", "类名");
这样就创建了一个指定的类的实例,但是,不要试图对这个obj进行反射,对这个obj进行反射,不能得到其实际类型的信息,因为在主程序文件夹中没有部署那个Assembly,而只会得到其已部署的基类和接口类型,只能对这些类型进行操作。
5. 调用
如果在主程序的AppDomain中加载了所创建的对象的基类或者接口类型,那么可以调用这些类型的相关成员。
如果没有,那么就通过调用LoadHelper中的相关方法来调用。
6.卸载与替换
程序运行起来后,Assembly所在文件夹中的这个已加载的Assembly文件,是可以被删除的,因为实际上加载的那个文件是其副本,删除之后程序照样运行,而替换一个新的,也不会起作用。只有当调用上面的Unload和Load方法,卸载和重新加载后,新的Assembly才会起作用。
namespace Library
public object InvokeMethod(string name, object obj, object[] paras)
public object InvokeInstanceMethodNotCachedAsm(string name, string assemblyFile, string typeName, object[] paras)
甚至还可以采取将Assembly缓存的机制,这样调用起来速度更快。
3.
调用程序中加载和卸载AppDomain:
static void Load()
static void Unload()
...{
AppDomain.Unload(appDomain);
}
在这里,有三点是关键,一是创建一个新的AppDomain,二是让这个新的AppDomain允许使用影像副本文件,三是要把影像副本目录设为非主程序所在文件夹。
这是因为.Net不允许卸载一个已加载的Assembly,除非卸载整个AppDomain,允许使用影像副本,.Net就把要加载的Assembly复制到另一个文件夹(在用户配置文件夹中),但程序所在文件夹中的Assembly并不被复制。
4.创建对象实例
object obj = appDomain.CreateInstanceFromAndUnwrap("Assembly文件名含路径", "类名");
这样就创建了一个指定的类的实例,但是,不要试图对这个obj进行反射,对这个obj进行反射,不能得到其实际类型的信息,因为在主程序文件夹中没有部署那个Assembly,而只会得到其已部署的基类和接口类型,只能对这些类型进行操作。
5. 调用
如果在主程序的AppDomain中加载了所创建的对象的基类或者接口类型,那么可以调用这些类型的相关成员。
如果没有,那么就通过调用LoadHelper中的相关方法来调用。
6.卸载与替换
程序运行起来后,Assembly所在文件夹中的这个已加载的Assembly文件,是可以被删除的,因为实际上加载的那个文件是其副本,删除之后程序照样运行,而替换一个新的,也不会起作用。只有当调用上面的Unload和Load方法,卸载和重新加载后,新的Assembly才会起作用。
相关文章推荐
- C#动态加载/卸载Assembly的解决方案
- C#动态加载/卸载Assembly的解决方案2
- C#动态加载/卸载Assembly的解决方案
- C#动态加载/卸载Assembly的解决方案
- C#中动态加载和卸载DLL
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序
- C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载
- C#动态加载和卸载字体 以文件的方式
- C#中动态加载和卸载DLL
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)5-----Assembly.Unload
- C#中动态加载和卸载DLL
- C#中使用反射来动态加载和卸载DLL
- C#中动态加载和卸载DLL
- C#中动态加载和卸载DLL
- C#中可以通过Assembly来动态加载DLL
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。
- C#中动态加载和卸载DLL
- C#动态加载卸载DLL
- C# 动态加载和卸载DLL
- C#中动态加载和卸载DLL