使用GAC的优点和缺点是什么?

时间:2020-03-05 18:42:17  来源:igfitidea点击:

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

解决方案

回答

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

回答

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

回答

当我自己研究此主题时,我发现对.NET全局程序集缓存进行神秘化处理
耶利米·塔卡尔(Jalemiah Talkar)为我提供了很多帮助。

回答

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

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

回答

优势:

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

坏处:

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

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

回答

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

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

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

回答

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

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

[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变量中一样,但是是以"托管方式"进行的。当然,这是相当简化的描述;)