我正在编写一些代码,这些代码依赖于在我在代码中引用它们之前加载的某些库。我知道我可以手动加载它们,但我试图避免这种情况。
在我的测试用例中,看起来我的silverlight应用程序引用的任何程序集都出现在AppDomain.CurrentDomain.GetAssemblies()
中,甚至在我使用其中的任何内容之前。
我的印象是只根据需要加载程序集,是不是这样?
由于预期只在需要时加载程序集,并且我唯一需要反射,我在项目中需要加载以下内容:
[AttributeUsage(AttributeTargets.Assembly)]
public class LoadFirst : Attribute {}
与
[assembly: LoadFirst]
这会强制加载吗?它看起来就像log4net用[assembly: log4net.Config.XmlConfigurator]
答案 0 :(得分:1)
伯纳德,
通过引用其他程序集创建程序集时(早期绑定)。所有参考详细信息都记录在新创建的程序集的元数据中,当您尝试加载程序集时,CLR将检查并加载引用的程序集。如果CLR无法加载任何引用的程序集(或引用的程序集引用的其他程序集),则加载过程将失败。
然后是后期绑定,您将使用在运行时发生的反射。
在这两种情况下,都会加载引用的程序集,但是在您的代码执行此操作之前,将不会在托管堆中创建其中定义的类型的实例。例如,假设有一个名为 MyCryptoLib.dll 的程序集,它定义了一个名为 OSCryptoLib 的类型来描述操作系统提供的加密库。它还公开了一个名为 GetOSCryptoLib 的方法来获取OSCryptoLib列表。
当您在程序集中引用 MyCryptoLib.dll 并加载程序集时,CLR将找到并加载 MyCryptoLib (以及MyCryptoLib所需的任何其他程序集),但不会创建任何 OSCryptoLib 的实例,而您的代码没有首先调用方法 GetOSCryptoLib
在SilverLight中查看 AssemblyPart ,看看这是否会有所帮助
希望这有帮助