`
冷寒冰
  • 浏览: 249137 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

应用程序域和程序集

    博客分类:
  • .net
 
阅读更多

NET Framework 2.0





其他版本









2(共 2)对本文的评价是有帮助 - 评价此主题






本主题描述应用程序域和程序集之间的关系。在可以执行程序集中所包含的代码之前,必须将程序集加载到应用程序域中。运行普通的应用程序会导致将几个程序集加载到一个应用程序域中。

程序集的加载方式决定其实时 (JIT) 编译代码是否可以在进程中由多个应用程序域共享,以及该程序集是否可以从进程中卸载。

如果程序集是以非特定于域的形式进行加载,则共享相同安全授权集的所有应用程序域都可以共享相同的 JIT 编译代码,从而减少应用程序所需的内存。但是,程序集则永远不能从进程中卸载。


如果程序集不是以非特定于域的形式进行加载,则它必须在加载的每个应用程序域中都是 JIT 编译的。但是,通过卸载程序集加载的所有应用程序域,可以从进程中卸载程序集。


运行库宿主决定在将运行库加载到进程中时是否以非特定于域的形式加载程序集。对于托管应用程序,将 LoaderOptimizationAttribute 属性应用于进程的入口点方法,并从关联的 LoaderOptimization 枚举指定一个值。对于承载公共语言运行库的非托管应用程序,当您调用 CorBindToRuntimeEx 方法时,指定适当的标志。

有三个选项用于加载非特定于域的程序集:

SingleDomain 不以非特定于域的形式加载任何程序集(Mscorlib 除外,它始终以非特定于域的形式加载)。此设置称作单域,因为它通常用在宿主只运行进程中的单个应用程序时。


MultiDomain 以非特定于域的形式加载所有程序集。此设置用于以下情况:进程中有多个应用程序域,所有这些应用程序域均运行相同的代码。


MultiDomainHost 以非特定于域的形式加载强名称程序集(如果它们以及它们的所有依赖项都已在全局程序集缓存中安装)。其他程序集都将针对它们加载的每个应用程序域分别进行加载和 JIT 编译,从而可以从进程中卸载。如果您在同一进程中运行多个应用程序,或者如果您有混合的程序集,其中包括许多应用程序域共享的程序集和需要从进程中卸载的程序集,则可以使用此设置。


以下程序集不能共享 JIT 编译代码:使用 Assembly 类的 LoadFrom 方法加载到“加载源”上下文中的程序集,或者使用 Load 方法的重载(指定字节数组)从图像加载的程序集。

使用 本机映像生成器 (Ngen.exe) 编译为本机代码的程序集如果在第一次加载到进程中时是以非特定于域的形式加载的,则可以在不同应用程序域之间共享这些程序集。

包含应用程序入口点的程序集的 JIT 编译代码只有在其所有依赖项都可以被共享的情况下,才可以被共享。

非特定于域的程序集可以进行多次 JIT 编译。例如,如果两个应用程序域的安全授权集不同,则它们不能共享相同的 JIT 编译代码。但是,JIT 编译程序集的每个副本都可以与其他具有相同授权集的应用程序域共享。

当您决定是否以非特定于域的形式加载程序集时,必须在减少内存占用和降低其他性能因素之间加以权衡。

对于非特定于域的程序集,对静态数据和方法的访问较慢的原因在于需要隔离程序集。访问该程序集的每一应用程序域都必须具有静态数据的单独副本,以避免跨域边界引用静态字段中的对象。因此,运行库包含附加的逻辑,用以将调用方引导到静态数据或静态方法的适当副本。这一额外的逻辑将降低调用速度。


当以非特定于域的形式加载程序集时,必须找到并加载该程序集的所有依赖项,因为如果一个依赖项不能以非特定于域的形式加载,则会妨碍以非特定于域的形式加载程序集。

分享到:
评论

相关推荐

    .net应用程序域、程序集、元数据、反射

    本主题描述应用程序域和程序集之间的关系。您必须首先将一个程序集加载到应用程序域中,然后才能运行该应用程序。运行普通的应用程序会导致将几个程序集加载到一个应用程序域中。默认情况下,公共语言运行库将一个...

    .net 动态创建应用程序域和卸载应用程序域

    3. **模块加载**:应用程序域负责加载和执行程序集,允许在运行时动态加载新的代码或更新现有代码。 4. **故障隔离**:如果一个应用程序域中的代码引发异常,不会影响到其他域,有利于系统的稳定性。 ### 二、动态...

    加载和卸载程序集

    然而,微软并没有提供卸载程序集的方法,原因是因为程序集的卸载会导致应用程序域的不稳定。CLR 产品单元经理 Jason Zander 解释了没有实现该功能的原因。 三、解决卸载程序集的折中方法 为了解决卸载程序集的问题...

    C# 应用程序域加载外部exe到当前窗口

    通过正确地创建和管理应用程序域,可以安全地执行外部代码,并将其窗口集成到主应用程序中,同时保持代码的隔离性和安全性。在实际开发中,还需要考虑错误处理、日志记录等细节,以确保系统的稳定运行。

    C#动态加载程序集

    动态加载程序集的机制是当C#应用程序在遇到当前应用程序域(AppDomain)里没有的程序集时,会自动搜索与应用程序在同一个目录里的所有程序集,看是否有该程序集,如果没有,则会抛出异常。 动态加载程序集的优点有...

    Framework 开发指南.docx

    应用程序域和程序集是.NET执行环境的基础,它们负责代码隔离和管理。序列化用于将对象状态转化为持久化格式,便于存储或传输。全球化和本地化支持开发适用于全球用户的多语言应用。辅助功能使得应用程序对残障人士更...

    程序集和访问级别约束

    私有程序集通常位于应用程序的本地目录下,只能被当前应用程序域访问。而全局程序集缓存是.NET Framework提供的一种特殊存储区域,用于存放需要跨多个应用程序共享的公共程序集。将程序集放入GAC可以实现多应用间的...

    C#语言参考手册.zip_C#语言_CSharp 程序员开发手册_C语言_c# 手册

    6. 应用程序域和程序集:了解.NET程序的组织方式。 7. 并发和异步编程:线程、Task、同步上下文、async/await。 8. LINQ:学习如何编写查询,以及LINQ to Objects、LINQ to XML、LINQ to SQL等。 9. ADO.NET和Entity...

    C# 程序集 类型加载 反射

    6. `AppDomain.GetAssemblies()`返回当前应用程序域(AppDomain)中已加载的所有程序集。 一旦我们有了`Assembly`对象,可以访问它的属性和方法,获取如程序集名称、版本、公钥、导出类型等信息。 接下来,我们...

    ClickOnce 按需下载程序集

    3. **加载程序集**:下载完成后,可以使用`Assembly.LoadFrom`或`Assembly.LoadFile`方法将程序集加载到应用程序域中,然后就可以使用其中的类型和方法。 4. **错误处理**:在处理过程中,需要捕获可能出现的异常,...

    c++语言程序集c++语言程序集

    文件名"C++语言程序集"可能包含了一系列C++编程的实例和示例代码,可以帮助初学者理解C++语言的用法和编程技巧。通过这些示例,你可以学习如何定义类、编写函数、使用STL容器、处理异常、实践多态性等。同时,还可以...

    AppDomain编程

    - **加载程序集**:可以在创建应用程序域后,使用 `AppDomain.Load` 方法将程序集加载到指定的应用程序域中。 - **卸载应用程序域**:当不再需要某个应用程序域时,可以使用 `AppDomain.Unload` 方法将其卸载。 ###...

    NET Framework 开发人员指南(word文档)

    8. AppDomain 类是.NET Framework提供的类,它提供了创建、配置和管理应用程序域的接口,包括加载和卸载程序集、处理事件以及与操作系统交互等功能。 9. 创建程序集是构建.NET应用程序的基础,开发者可以使用C#、VB...

    matlab常用算法程序集

    在IT领域,Matlab是一种广泛使用的数学计算软件,尤其在科学和工程计算...无论你是初学者还是经验丰富的用户,这个“matlab常用算法程序集”都是一个宝贵的资源,能帮助你提升Matlab编程技能,解决各种数学和工程难题。

    插件式框架探索.pdf

    2. 动态加载和卸载:在应用程序域中,可以动态地加载和卸载程序集,这使得插件的更新和替换变得非常灵活。一旦不再需要某个插件,可以通过卸载其所在的应用程序域来释放资源。 3. 安全策略:每个应用程序域可以有...

Global site tag (gtag.js) - Google Analytics