【问题标题】:Are all referenced libraries loaded at startup是否在启动时加载了所有引用的库
【发布时间】:2013-05-30 00:27:58
【问题描述】:

我正在编写一些代码,这些代码取决于在我在代码中引用它们之前加载的某些库。我知道我可以手动加载它们,但我试图避免这种情况。

在我的测试用例中,似乎我的 silverlight 应用程序引用的任何程序集都存在于 AppDomain.CurrentDomain.GetAssemblies() 中,甚至在我使用其中的任何内容之前。

我的印象是程序集仅在需要时加载,不是这样吗?


预计仅在需要时才加载程序集,而我唯一需要的是反射,我在项目中需要加载以下内容:

[AttributeUsage(AttributeTargets.Assembly)]
public class LoadFirst : Attribute {}

[assembly: LoadFirst]

这会强制加载吗?看起来这就是 log4net 对 [assembly: log4net.Config.XmlConfigurator] 所做的事情

【问题讨论】:

    标签: c# .net silverlight dll runtime


    【解决方案1】:

    伯纳德,

    当您通过引用其他程序集创建程序集时,(早期绑定)。所有引用详细信息都记录在新创建的程序集的元数据中,当您尝试加载程序集时,CLR 将检查并加载引用的程序集。如果 CLR 未能加载任何引用的程序集(或被引用的程序集引用的其他程序集),则加载过程将失败。

    然后是后期绑定,您将使用在运行时发生的反射。

    在这两种情况下,都会加载引用的程序集,但在托管堆中定义的类型的实例不会在托管堆中创建,直到您的代码明确地这样做。例如,假设有一个名为 MyCryptoLib.dll 的程序集,它定义了一个名为 OSCryptoLib 的类型来描述操作系统提供的加密库。它还公开了一个名为 GetOSCryptoLib 的方法来获取 OSCryptoLib 的列表。

    当您在程序集中引用 MyCryptoLib.dll 并加载程序集时,CLR 将定位并加载 MyCryptoLib(以及 MyCryptoLib 所需的任何其他程序集)但不会创建OSCryptoLib 的任何实例,没有您的代码首先调用方法 GetOSCryptoLib

    在 SilverLight 中查看 AssemblyPart,看看这是否会有所帮助

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多