【发布时间】:2010-08-09 20:15:23
【问题描述】:
两者都有什么影响和建议的场景?
【问题讨论】:
标签: c# assembly-loading
两者都有什么影响和建议的场景?
【问题讨论】:
标签: c# assembly-loading
Assembly.Load 是动态引用,因为您在运行时动态加载外部 DLL。当您添加对 .NET 项目的引用并使用该引用构建项目时,您会考虑使用静态引用。
编辑:
来自 MSDN 文档:
编译器记录静态引用 在程序集清单的元数据中 构建时间。
嗯,我自己也不确定这个。我暂时把我的答案放在这里,希望能得到更多的修正或看到更好的答案。
【讨论】:
参考:
有什么影响和 建议使用的场景?
通常,如果我使用Assembly.Load(),那是因为我正在开发一个可插拔系统。动态引用有助于包含不一定属于我的构建的程序集。
从动态加载的程序集中实例化类型至少需要一些反射。通过确保动态加载的类型实现一些已知的接口或基类(来自静态加载的程序集),可以减轻必要的反射量。
简而言之,使用动态加载的程序集需要做很多工作;但是,这样做可以通过允许用户开发插件来使应用程序更加灵活。只需权衡动态引用的预期灵活性(可能不是必需的)和 Visual Studio 对静态引用的设计时支持之间的权衡。
如果构建插件架构,值得考虑的做法是将程序集加载到它们自己的 AppDomain 中。这样做允许您对您可能不完全信任的程序集的安全权限进行更细粒度的控制,并提供可以在运行时卸载程序集的额外好处。就个人而言,我发现使用 AppDomains 是一项劳动密集型工作。但是,如果需要好处,很高兴知道 AppDomain 在那里。
【讨论】:
MSDN(http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx) 中所述的动态引用将动态引用引用为仅加载具有足够信息的引用,运行时必须搜索正在加载的程序集。使用静态引用,程序集(GAC、应用程序目录等)的位置是已知的,并且仍然可以使用 Assembly.load 完成。
【讨论】: