8

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

4

3 回答 3

10

Assembly.Load是动态引用,因为您在运行时动态加载外部 DLL。当您添加对 .NET 项目的引用并使用该引用构建项目时,您会考虑使用静态引用。

编辑:

来自 MSDN 文档:

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

嗯,我自己不确定这个。我暂时将我的答案保留在这里,以期获得更多更正评论或看到更好的答案。

于 2010-08-09T20:18:13.653 回答
2

在参照:

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

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

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

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

如果构建插件架构,值得考虑的做法是将程序集加载到它们自己的 AppDomain 中。这样做允许您对您可能不完全信任的程序集的安全权限进行更细粒度的控制,并提供可以在运行时卸载程序集的额外好处。就个人而言,我发现使用 AppDomains 是一项劳动密集型工作。但是,如果需要好处,很高兴知道 AppDomains 在那里。

于 2010-08-09T20:39:06.767 回答
0

MSDN ( http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx ) 中所述的动态引用将动态引用引用为仅加载具有运行时必须的足够信息的引用搜索正在加载的程序集。使用静态引用,程序集(GAC、应用程序目录等)的位置是已知的,并且仍然可以使用 Assembly.load 完成。

于 2010-08-09T20:23:49.567 回答