0

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

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

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


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

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

[assembly: LoadFirst]

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

4

1 回答 1

1

伯纳德,

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

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

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

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

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

希望这可以帮助

于 2013-05-30T05:56:21.897 回答