关于.net:使用GAC有哪些优点和缺点?

关于.net:使用GAC有哪些优点和缺点?

What are the advantages and disadvantages of using the GAC?

最重要的是,是否存在必须使用全局程序集缓存或无法使用全局程序集缓存的情况?


  • 从GAC加载程序集意味着更少的开销和安全性,您的应用程序将始终加载正确版本的.NET库
  • 您不应该在GAC之外的ngen程序集,因为几乎没有性能提高,在许多情况下甚至会降低性能。
  • 您已经在使用GAC,因为所有标准.NET程序集实际上都在GAC中并已增强(在安装过程中)。
  • 对自己的库使用GAC会增加部署的复杂性,我将不惜一切代价避免这种情况。
  • 如果要将某些内容放入GAC,则在安装过程中需要以管理员身份登录用户,这对于许多类型的应用程序来说都是一个问题。

因此,总而言之,从简单开始,如果以后将组件放入GAC和NGEN中,然后再看到主要的性能提升,那就去做吧,否则就不要打扰了。 GAC更适用于期望在更多应用程序之间共享库的框架,在99%的情况下,您不需要它。


优点:

  • 只有一个地方可以更新程序集
  • 您使用的硬盘空间要少一些

坏处:

  • 如果您只需要更新一个网站,则不需要。您可能会导致网络服务器中的其他网站损坏

建议:将GAC留给MS和朋友。千兆字节现在非常便宜。


要求提高权限的程序集也可以使用GAC来代表不太受信任的代码(例如,部分信任的ASP.NET应用程序)执行特权操作。

例如,假设您有一个部分信任的ASP.NET应用程序,该应用程序需要执行需要提升特权的任务,即完全信任。解决方案是将需要提升特权的代码放入单独的程序集中。程序集用AllowPartiallyTrustedCallers属性标记,而包含特权逻辑的类则用PermissionSet属性标记,如下所示:

1
[PermissionSet(SecurityAction.Assert, Unrestricted=true)]

我们的程序集将被赋予一个强名称(签名),然后部署到GAC中。

现在,我们的部分受信任的应用程序可以利用GAC中的受信任程序集来执行一组特定且狭窄的特权操作,而不会失去部分信任的好处。


如果要运送包含多个程序集的可重用库,但只有极少数组成一个外观,则可以考虑将程序包安装到GAC(如果该程序包已安装到开发人员的PC上)。

想象一下,您运送了6个装配,而这6个装配中只有一个包含立面-即其他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。但是,当他们的项目运行时,它必须能够递归加载其引用的所有程序集。如何做到这一点?通常,它们必须在GAC中的Bin文件夹中可用:

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

注意:在将项目运送到生产PC时,最后一个选项不会使您做同样的事情。您可以将所有程序集都放在Bin文件夹中,也可以将它们安装到GAC中-所有这些都取决于您的意愿。

因此,所描述的解决方案显示了在开发过程中将第三方程序集放入GAC的优势。它与生产无关。

您可能会发现,安装到GAC中主要是为了解决所需组件(依赖项)的位置问题。如果某个程序集已安装到GAC中,则您可能会认为该程序在"附近"存在任何应用程序。这就像将.exe的路径添加到PATH变量中一样,但是是以"托管方式"进行的。 -当然,这是简化的说明;)


GAC与完全信任一起运行,并且可由Web应用程序外部的应用程序使用。例如,Sharepoint中的Timer Jobs必须位于GAC中,因为sptimer服务是一个单独的进程。

"完全信任"部分也是安全问题的可能来源。当然,您可以使用代码访问安全性,但是不幸的是,使用CAS时,我看不到太多程序集:( / bin文件夹可以锁定为中级,通常情况下很好。

丹尼尔·拉森(Daniel Larson)在CAS上也有一篇文章,其中详细介绍了差异。


我认为使用GAC的最大优点之一是,您可以注册同一程序集的多个版本,并且可用于您的应用程序。就我个人而言,我不喜欢它如何限制机器之间的移动(我不喜欢说,在新的VPC上检查源代码并经过一系列步骤使其运行,因为我必须在其中注册内容GAC)


一生中,我可能只有一个应用程序需要在GAC中放置程序集,这仅仅是因为这些程序集是框架的一部分,许多应用程序都会使用它,将它们放入GAC似乎是正确的。


推荐阅读