是否在启动时加载了所有引用的库

时间:2013-05-30 00:27:58

标签: c# .net silverlight dll runtime

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

在我的测试用例中,看起来我的silverlight应用程序引用的任何程序集都出现在AppDomain.CurrentDomain.GetAssemblies()中,甚至在我使用其中的任何内容之前。

我的印象是只根据需要加载程序集,是不是这样?


由于预期只在需要时加载程序集,并且我唯一需要反射,我在项目中需要加载以下内容:

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

[assembly: LoadFirst]

这会强制加载吗?它看起来就像log4net用[assembly: log4net.Config.XmlConfigurator]

做的那样

1 个答案:

答案 0 :(得分:1)

伯纳德,

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

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

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

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

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

希望这有帮助