使用Assembly.Load是静态引用还是动态引用?

9
什么是影响和建议情景,可以使用其中之一?
3个回答

10

Assembly.Load 是一个动态引用,因为它在运行时动态加载外部 DLL 。静态引用更像是当您向 .NET 项目添加引用并使用该引用构建项目时。

编辑:

来自 MSDN 文档:

编译器在构建时将静态引用记录在程序集清单的元数据中。

嗯,对于这个问题我也不确定。目前先保留我的答案,希望能得到更多纠正评论或者更好的答案。


我认为这并不完全正确...如MSDN(http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx)所述,动态引用是指仅加载足够的信息以便运行时搜索正在加载的程序集的引用。对于静态引用,程序集的位置(GAC、应用程序目录等)是已知的,并且可以使用Assembly.load来实现。 - Achilles

2

关于:

使用它们的意义和建议的场景是什么?

通常情况下,如果我使用 Assembly.Load(),那是因为我正在开发一个可插拔的系统。动态引用有助于包含不一定是构建的一部分的程序集。

从动态加载的程序集中实例化类型需要至少一些反射。可以通过确保动态加载的类型实现了某个已知接口或基类(来自静态加载的程序集)来减少所需的反射量。

简而言之,使用动态加载的程序集需要大量工作;但是,这样做可以使应用程序更加灵活,允许用户开发插件。只需权衡预期灵活性(可能不是必需的)和 Visual Studio 对静态引用的设计时支持的权衡即可。

如果正在构建插件架构,则值得考虑的一种做法是在它们自己的 AppDomains 中加载程序集。这样做允许您对您可能不完全信任的程序集的安全权限进行更细粒度的控制,并提供了卸载运行时的程序集的附加好处。就个人而言,我发现使用 AppDomains 需要很多工作;但是,如果需要这些好处,知道 AppDomains 存在是很好的。


0
如MSDN所述(http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx),动态引用是指仅提供足够信息以便运行时搜索正在加载的程序集的引用。与静态引用不同,程序集的位置(GAC、应用程序目录等)是已知的,并且可以使用Assembly.load完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接