使用GAC有哪些优缺点?

时间:2008-08-22 21:41:59

标签: .net gac

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

7 个答案:

答案 0 :(得分:47)

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

所以总结一下,开始简单,如果你以后看到主要的性能提升,如果你把你的组件放入GAC和NGEN中,那就去吧,否则不要打扰。 GAC更适合于希望在更多应用程序之间共享库的框架,在99%的情况下,您不需要它。

答案 1 :(得分:21)

优势:

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

缺点:

  • 如果您只需要更新一个网站,则不能。您可以使用网络服务器中的其他网站结束

建议:将GAC留给MS和朋友。技嘉现在非常便宜。

答案 2 :(得分:18)

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

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

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

我们的程序集将具有强名称(已签名),然后部署到GAC中。

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

答案 3 :(得分:7)

GAC以完全信任方式运行,可供Web应用程序之外的应用程序使用。例如,Sharepoint中的计时器作业必须位于GAC中,因为sptimer服务是一个单独的进程。

“完全信任”部分也是安全问题的可能来源。当然,你可以使用代码访问安全性,但我不会看到太多使用CAS的程序集:( / bin文件夹可以锁定到中,这通常很好。

Daniel Larson有一个post on CAS as well,详细说明了这些差异。

答案 4 :(得分:7)

如果您要发布包含多个程序集的可重用库,但只有少数几个构成外观,则可以考虑将程序集安装到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 。但是当他们的项目运行时,它必须能够加载它所引用的所有程序集 - 递归。如何实现这一目标?通常,它们必须在Bin文件夹中,在GAC中可用:

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

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

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

您可能会发现,安装到GAC主要是为了解决所需程序集(依赖项)的位置问题。如果将程序集安装到GAC中,您可能会认为它存在于任何应用程序“附近”。这就像将.exe的路径添加到PATH变量,但是以“托管方式”。 - 当然,这是相当简化的描述;)

答案 5 :(得分:6)

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

答案 6 :(得分:3)

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