何时何时不安装到GAC中?

什么时候应该安装到GAC中,何时不应该? (我的意思是说,当他们购买我们的产品时,在客户机上安装)。

  1. 我有一个程序集只能用于我的一个应用程序(GAC或非GAC)?

  2. 我有一个程序集,所有我的应用程序共享(GAC或无GAC)?

  3. 我的所有应用程序都可能使用我的程序集(GAC或非GAC)的不同版本?

这是三种情况,但我相信还有更多。 我不一定只看到这三个问题的答案。

类似的问题: 使用GAC有哪些优缺点?

一般MS准则

  1. 没有
  2. 没有
  3. 没有

GAC实际上是Microsoft常用.NET库的存储库。 是的,他们让开发人员也使用它,但作为一个经验法则,如果你不需要GAC,不要使用它。 保持简单和本地的东西,如果不伤害。

  • 考虑到性能方面的原因,我会考虑GAC,例如,如果您有一些庞大的程序集,请尝试将它们放入GAC和NGEN中 。 这应该会显着提高性能。 Microsoft在安装过程中为所有标准的.NET框架程序集(现在你知道为什么安装需要这么长时间了)。 Paint.NET也能做到这一点(改善他们的应用程序的启动时间)。 然而,我们大多数人不是在大型框架或者photoshop竞争对手上工作,所以大多数时候,在GAC中组装的性能收益是最小的。 不值得放弃简单的x-copy部署。

  • 有些开发人员可能会使用GAC来确保权限不足的用户无法删除或修改其程序集。

  • 对于其他人来说,这可能是版本控制的原因,但在这里你应该重新考虑。 我不会重复已经说过的话, 你可以在这里读到为什么 。

不要忘记,一旦你想部署到GAC,你的安装程序将需要pipe理员权限,你几乎可以忘记一次部署,等等…

GAC的有用案例:

  • COM可调用的代码 – 即你想要一些非.NET代码能够访问你,而不用搞乱dll等
  • 服务组件 (COM +)
  • 如果您正在编写如此常见的代码,那么使用GAC(主要是.NET框架组件等)实际上是有意义的
  • 如果你想用NGEN来预先编码的话

除此之外,我倾向于避免像瘟疫一样的GAC。 只需通过robocopy等应用程序部署必要的dll就简单多了; 这给隔离容易部署。

如果您正在安装asp.net web应用程序,并且您是所有者并完全控制了计算机,那么在某些情况下,将计划在全局程序集caching中跨站点/ Web实例共享您的程序集是有意义的。

如果将程序集放到GAC中,则可以显着改善应用程序在具有相同ASP.NET应用程序的多个实例的服务器上的初始加载时间和内存使用情况。 至less我在我们的服务器上看到了几十个安装。

如果您要发布由多个程序集组成的可重用的库,但只有less数几个程序集构成外观,则可以考虑将程序集安装到GAC中(如果程序包安装到开发人员的PC上)。

试想一下,你运送了6个assembly体,这6个assembly体中只有一个assembly了一个门面 – 也就是说其他5个只由门面本身使用。 您运送:

  • MyProduct.Facade.dll – 这是开发人员使用的唯一组件
  • MyProduct.Core.dll – 由MyProduct.Facade.dll使用,但不打算供开发人员使用
  • MyProduct.Component1.dll – 相同
  • MyProduct.Component2.dll – 相同
  • ThirdParty.Lib1.dll – MyProduct.Component1.dll使用的第三方库
  • ThirdParty.Lib2.dll – 相同
  • 等等

使用你的项目的开发人员只想在他们自己的项目中引用MyProduct.Facade.dll 。 但是当他们的项目运行时,它必须能够recursion地加载它引用的所有程序集。 这可以如何实现? 一般来说,它们必须在GAC中的Bin文件夹中可用:

  • 您可能会要求开发人员find您的安装文件夹,并添加引用到您放在那里的所有N程序集。 这将确保它们将被复制到Bin文件夹中以在运行时可用。
  • 您可以安装已经包含这6个引用的 VS.NET项目模板。 有点复杂,因为你应该在你的程序集安装之前 实际的path注入到这个模板中。 这只能由安装程序完成,因为此path取决于安装path。
  • 您可能会要求开发人员在.csproj / .vbproj文件中创build一个特殊的构build后步骤,将必要的依赖项复制到Bin文件夹。 同样的缺点。
  • 最后,您可以将所有程序集安装到GAC中 。 在这种情况下,开发人员必须从他们的项目中添加引用到MyProduct.Facade.dll。 无论如何,其他的东西都可以在运行时使用。

注意:最后一个选项不会使您在将项目发送到生产PC时执行相同操作。 您可以将所有程序集发送到Bin文件夹中,或者将它们安装到GAC中,这些都取决于您的所有愿望。

因此,所描述的解决scheme显示了在开发期间将第三方程序集joinGAC的优势。 这与生产无关。

您可能会发现,安装到GAC主要是为了解决所需程序集(依赖项)的位置问题。 如果程序集安装到GAC中,则可能认为它存在于“附近”任何应用程序中。 这就像添加path到您的PATHvariables的.exe,但以“pipe理的方式”。 – 当然这是比较简单的描述;)

这里是Chris Sells的名为“避免GAC”的链接

http://www.sellsbrothers.com/spout/default.aspx?content=archive.htm#Avoid_the_GAC

解释是相当长的,但总之,他确定的两个案例是

  1. 修复重要的错误而不触及受影响的应用程序(并且不会破坏任何东西!)

  2. 在分开部署的程序集之间运行时共享types

注意: Chris的post末尾有一个很长的讨论线索,非常好的评论列表。

首先,如果您要在客户端计算机上安装此应用程序,则需要添加一个自定义操作以在GAC中安装应用程序,另一个应用程序在删除时添加。

对于情况A绝对不是GAC

对于情况B,如果您的库将不断更改,则需要每次将每个版本的程序集添加到gac中,并更新到该组件

在案例C并排执行允许您运行不同的程序集版本,你不需要添加任何东西来区分版本。

只有当你真的需要使用

只有在同一台服务器上的大量Web应用程序共享相同的库时,才能安装到GAC中。 例如,在Sharepoint服务器上,可能有数百个网站都需要共享相同的Web部件,因此在这种情况下,将已编译的Web部件部署到GAC是有意义的。