【问题标题】:How are assemblies loaded into the AppDomain?程序集如何加载到 AppDomain 中?
【发布时间】:2013-09-11 20:51:13
【问题描述】:

什么决定了程序集何时以及是否加载到 AppDomain 中。

我想我想了解是否:

  1. 我保证所有项目引用的程序集都将 在我的应用程序开始时加载。
  2. 如果不是确切时间 他们得到加载?这将是我第一次使用 该程序集中的类/函数?
  3. 有没有办法告诉 如果必须在执行之前首先加载程序集,则编译时间 在我的代码的第一行? (我知道我可以使用反射,但我 想知道我是否可以在编译时配置它)
  4. 假设我 可以控制何时加载程序集,依赖项呢 部件?我可以告诉执行只加载 1 级/2 级吗 让其余的动态加载?

【问题讨论】:

    标签: c# .net compiler-construction clr .net-assembly


    【解决方案1】:
    1. 不,您可以得到相反的保证:只加载启动时直接需要的程序集。
    2. 是的,一旦某个类需要来自该程序集的类型信息或需要该程序集的代码将被 JIT 化,就会尝试加载程序集。
    3. 不,没有办法在编译时强制程序集加载顺序缺少从您的 Main 中的每个程序集引用某些内容(请注意,通常目标是相反的 - 延迟加载尽可能多的程序集以加快加载速度应用程序)。
    4. 不,您无法控制自动加载(正如 Simon Edström 指出的那样,当 CLR 决定需要程序集时会触发 Assembly Resolve 事件)。如果您知道依赖关系,您始终可以自己预加载程序集。

    注意:程序集不直接“相互依赖”,只是每个程序中的类/方法相互依赖。

    【讨论】:

    • 根据更多的研究,使用 NGEN(本机图像生成器)可能有 1 种影响 (3) 的方法 - 但它是另一种蠕虫。
    【解决方案2】:

    我不知道细节,但我知道当无法加载程序集时会触发事件。所以我猜它们是在运行时加载的,你可以向它添加例程。

    我认为这将有助于您了解 Assembly Resolve http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

    关于程序集加载事件http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多