最重要的是,是否有必须使用全局程序集缓存或无法使用它的情况?
从GAC加载程序集意味着更少的开销和安全性,您的应用程序将始终加载正确版本的.NET库
您不应该使用GAC之外的程序集,因为几乎没有性能提升,在许多情况下甚至会降低性能.
您已经在使用GAC,因为所有标准.NET程序集实际上都在GAC中并且在安装期间(在安装期间).
将GAC用于您自己的库会增加部署的复杂性,我会不惜一切代价避免它.
如果要将某些内容放入GAC,则需要在安装期间将您的用户记录为管理员,这对于许多类型的应用程序来说都是一个很大的问题.
总而言之,如果你稍后看到主要的性能提升,如果你把你的组件放入GAC和NGEN中,那么就去做吧,否则不要打扰.GAC更适合于期望在更多应用程序之间共享库的框架,在99%的情况下,您不需要它.
优点:
只有一个地方可以更新您的程序集
您使用的硬盘空间少一点
坏处:
如果您只需要更新一个网站,则不能.您最终可能会破坏网络服务器中的其他网站
建议:将GAC留给MS和朋友.千兆字节现在非常便宜.
GAC也可以由需要提升权限的程序集使用,以代表不太受信任的代码执行特权操作(例如,部分信任ASP.NET应用程序).
例如,假设您有一个部分信任的ASP.NET应用程序,它需要执行需要提升权限的任务,即完全信任.解决方案是将需要提升权限的代码放入单独的程序集中.程序集用AllowPartiallyTrustedCallers
属性标记,包含特权逻辑的类用PermissionSet属性标记,如下所示:
[PermissionSet(SecurityAction.Assert, Unrestricted=true)]
我们的程序集将具有强名称(已签名),然后部署到GAC中.
现在,我们部分受信任的应用程序可以利用GAC中的受信任程序集来执行特定且狭窄的特权操作集,而不会失去部分信任的好处.
GAC以完全信任方式运行,可供Web App外部的应用程序使用.例如,Sharepoint中的计时器作业必须位于GAC中,因为sptimer服务是一个单独的进程.
"完全信任"部分也是安全问题的可能来源.当然,您可以使用代码访问安全性,但我不会看到太多使用CAS的程序集:(/bin文件夹可以锁定到中,这通常很好.
Daniel Larson也有一篇关于CAS的文章,其中详细介绍了差异.
如果您要发布包含多个程序集的可重用库,但只有少数几个构成外观,则可以考虑将程序集安装到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的最大优势之一是您可以为您的应用程序注册并提供相同程序集的多个版本.就我个人而言,我不喜欢它如何限制机器之间的移动(我不喜欢说,检查一个新的VPC上的源代码并通过一系列步骤让它运行因为我必须注册的东西GAC)