谁能说说AppDomain有什么用?该怎么用?有的是分!
---------------------------------------------------------------
http://www.microsoft.com/china/msdn/library/dncscol/html/csharp05162002.asp
---------------------------------------------------------------
操作系统和运行库环境通常会在应用程序间提供某种形式的隔离。为确保在一个应用程序中运行的代码不会对其他不相关的应用程序产生不良影响,这种隔离是必需的。
应用程序域提供安全而通用的处理单元,公共语言运行库可使用它来提供应用程序之间的隔离。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。
以前使用进程边界来隔离在同一台计算机上运行的应用程序。每一个应用程序被加载到单独的进程中,这样就将该应用程序与在同一台计算机上运行的其他应用程序相隔离。
隔离这些应用程序的原因在于内存地址是与进程相关的;在目标进程中,不能通过任何有意义的方式使用从一个进程传递到另一个进程的内存指针。此外,您不能在两个进程间进行直接调用。您必须代之以使用代理,它提供一定程度的间接性。
托管代码必须先通过一个验证过程,然后才能运行(除非管理员已授权跳过该验证)。此验证过程将确定这些代码是否会尝试访问无效的内存地址或执行导致代码运行时所在的进程无法正常运行的其他操作。通过此验证测试的代码将被认为是类型安全的。由于公共语言运行库能够验证代码是否为类型安全的代码,所以它可以提供与进程边界一样大的隔离级别,而其性能开销则要低得多。
应用程序域提供安全而通用的处理单元,公共语言运行库可使用它来提供应用程序之间的隔离。您可以在具有同等隔离级别(存在于单独的进程中)的单个进程中运行几个应用程序域,而不会造成进程间调用或进程间切换等方面的额外开销。在一个进程内运行多个应用程序的能力显著增强了服务器的可伸缩性。
隔离应用程序对于应用程序安全也是十分重要的。例如,您可以在单个浏览器进程中运行几个 Web 应用程序中的控件,同时使这些控件不能访问彼此的数据和资源。
应用程序域所提供的隔离具有以下优点:
在一个应用程序中出现的错误不会影响其他应用程序。因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。
能够在不停止整个进程的情况下停止单个应用程序。使用应用程序域使您可以卸载在单个应用程序中运行的代码。
注意 您不能卸载单个程序集或类型。只能卸载整个域。
在一个应用程序中运行的代码不能直接访问其他应用程序中的代码或资源。为了强制实施此隔离,公共语言运行库禁止在不同应用程序域中的对象之间进行直接调用。要在各域之间传递对象,可以复制这些对象,或通过代理访问这些对象。如果复制对象,那么对该对象的调用为本地调用。也就是说,调用方和被引用的对象位于同一应用程序域中。如果通过代理访问对象,那么对该对象的调用为远程调用。在此情况下,调用方和被引用的对象位于不同的应用程序域中。域间调用所采用的远程调用结构与两个进程间的调用或两台计算机间的调用结构相同。因此,被引用的对象的元数据必须对于两个应用程序域均可用,以便用 JIT 正确编译该方法调用。如果调用域无法访问被调用对象的元数据,则编译可能会失败,引发 System.IO.FileNotFound 类型的异常。有关详细信息,请参阅使用 .NET 远程处理访问其他应用程序域中的对象。确定如何跨域访问对象的机制是由该对象决定的。有关更多信息,请参阅 MarshalByRefObject 类。
代码行为的作用范围由它运行所在的应用程序决定。换言之,应用程序域将提供应用程序版本策略等配置设置、它所访问的任意远程程序集的位置,以及加载到该域中的程序集的位置信息。
向代码授予的权限可以由代码运行所在的应用程序域来控制。
---------------------------------------------------------------
应用程序域通常由运行库宿主以编程的方式来创建和操作。但是,有时应用程序还可能要和应用程序域结合起来使用。例如,应用程序可以将一个应用程序组件卸载到一个域中,以避免停止整个应用程序。
AppDomain 类是应用程序域的编程接口。此类包括各种方法,这些方法可以创建和卸载域、创建域中各类型的实例以及卸载域。下表列出了常用的 AppDomain 方法。
AppDomain 方法 说明
CreateDomain 创建新的应用程序域。CreateDomain 利用一组属性自定义域的各个方面,例如应用程序基地(即该应用程序的根目录)、域的配置文件的位置和公共语言运行库用于将程序集加载到域中的搜索路径。
CreateInstanceFrom 在应用程序域中创建指定类型的实例。
Load 将程序集加载到应用程序域中。
Unload 执行域的正常关闭。只有应用程序域中正在运行的所有线程都已停止或域中不再有运行的线程之后,才卸载该应用程序域。
在公共语言运行库宿主接口规范中介绍的非托管接口也提供对应用程序域的访问。运行库宿主可以使用非托管代码的接口在进程内创建应用程序域和获取对这些应用程序域的访问。
---------------------------------------------------------------
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconprogrammingwithapplicationdomains.asp
---------------------------------------------------------------
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconapplicationdomains.asp
---------------------------------------------------------------
看看这段代码
internal abstract class XPTypeActivator {
public static Type GetType(string assemblyName, string typeName) {
Assembly assembly = null;
foreach(Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
if(a.GetName().Name == assemblyName) {
assembly = a;
break;
}
}
if(assembly == null)
assembly = Assembly.LoadWithPartialName(assemblyName);
return assembly == null ? null : assembly.GetType(typeName);
}
}
---------------------------------------------------------------
看看鄙人写的一篇,或许能够帮助一点
http://www.csdn.net/develop/read_article.asp?id=22457