代码之家  ›  专栏  ›  技术社区  ›  GilliVilla

正在使用程序集。是否加载静态引用或动态引用?

  •  8
  • GilliVilla  · 技术社区  · 14 年前

    使用这两种方法的含义和建议方案是什么?

    3 回复  |  直到 13 年前
        1
  •  10
  •   Tim Cooper    13 年前

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

    编辑:

    来自msdn文档:

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

    嗯,我自己也不确定这个。我将把我的答案暂时保留在这里,希望得到更多的更正意见或看到更好的答案。

        2
  •  2
  •   kbrimington    14 年前

    关于:

    这意味着什么? 建议使用哪种方案?

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

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

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

    如果构建插件架构,一个值得考虑的实践是在自己的AppDomain中加载程序集。这样做允许您对可能不完全信任的程序集的安全权限拥有更细粒度的控制,并提供了可以在运行时卸载程序集的额外好处。就我个人而言,我发现与AppDomain合作是劳动密集型的;但是,如果需要利益,最好知道AppDomain在那里。

        3
  •  0
  •   Achilles    14 年前

    MSDN中所述的二元参考( http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx )引用动态引用作为加载引用,而该引用只包含运行时必须搜索正在加载的程序集的足够信息。对于静态引用,程序集(GAC、应用程序目录等)的位置是已知的,并且仍然可以使用assembly.load完成。