【问题标题】:Control when referenced .NET assemblies are loaded控制何时加载引用的 .NET 程序集
【发布时间】:2012-10-30 07:43:04
【问题描述】:

通常,当执行被引用程序集中某个类型的第一个方法时,会加载程序集的被引用程序集。

在应用程序流可以容忍延迟的点强制加载所有引用的程序集以避免它在可能无法容忍的进一步执行中(例如在时间关键的方法中)是否有意义?

如果是,最好的方法是什么? (反射,...)

【问题讨论】:

  • 到目前为止,最好的方法是在时间不重要时执行一次。这样可以确保在磁盘上找到程序集文件,加载其 IL 并及时编译代码。当心垃圾收集器,它可能会导致暂停,因此请编写仅使用预分配对象的方法。
  • 好的,您能否更具体地说明在时间不重要时必须执行的操作?
  • 谢谢,现在我知道你的意思了...

标签: c# .net reflection .net-assembly


【解决方案1】:

我现在雇主的一个产品从入口程序集的目录中获取所有 DLL 的列表。然后它使用Assembly.LoadFrom 将它们全部加载。它在启动画面启动时执行此操作。坦率地说,代码让我害怕。我们不得不采取一些技巧来避免某些 DLL。在更新之前,我们必须更改安装程序以清除目标目录。这是一个非常不安全的计划。

在之前的工作中,我编写了一个类似的函数,使用了GetReferencedAssemblies 方法。从入口程序集开始,它将递归地调用它,然后是Assembly.LoadFrom。它会在加载我们产品未附带的程序集后停止递归。它奏效了,但我认为没有必要。

在我目前工作的产品中,我们使用 Autofac 为应用程序构建完整的依赖关系树。用于配置的引导程序代码引用了整个项目中的所有服务——我猜这至少占代码的 70%。同样,这是在启动画面启动时触发的。这是正确的做法。它平衡了“加载必需品”与“花时间加载所有东西,包括可能永远不会使用的东西”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2010-12-09
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多