最重要的是,是否存在必须使用全局程序集缓存或无法使用它的情况?
答案 0 :(得分:47)
所以总结一下,开始简单,如果你以后看到主要的性能提升,如果你把你的组件放入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 。但是当他们的项目运行时,它必须能够加载它所引用的所有程序集 - 递归。如何实现这一目标?通常,它们必须在Bin文件夹中,在GAC中可用:
注意:在将项目运送到生产PC时,最后一个选项不会让您这样做。您可以在Bin文件夹中发送所有程序集,也可以将它们安装到GAC中 - 所有这些都取决于您的所有愿望。
因此,所描述的解决方案显示了在开发过程中将第三方程序集放入GAC的优势。它与生产无关。
您可能会发现,安装到GAC主要是为了解决所需程序集(依赖项)的位置问题。如果将程序集安装到GAC中,您可能会认为它存在于任何应用程序“附近”。这就像将.exe的路径添加到PATH变量,但是以“托管方式”。 - 当然,这是相当简化的描述;)
答案 5 :(得分:6)
我认为使用GAC的最大优势之一是您可以为您的应用程序注册并提供相同程序集的多个版本。就我个人而言,我不喜欢它如何限制机器之间的移动(我不喜欢说,检查新的VPC上的源代码并通过一系列步骤让它运行因为我必须注册的东西GAC)
答案 6 :(得分:3)
在我的一生中,我可能有一个应用程序,我必须在GAC中放置一个程序集,因为这些程序集是许多应用程序将使用它的框架的一部分,并且它们似乎是正确的进入GAC。