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

===============>>#1 票数:48

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

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

===============>>#2 票数:21

优点:

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

坏处:

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

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

===============>>#3 票数:18

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

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

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

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

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

===============>>#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 但是当他们的项目运行时,它必须能够加载它所引用的所有程序集 - 递归。 如何实现这一目标? 通常,它们必须在GAC中的Bin文件夹中可用:

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

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

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

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

===============>>#5 票数:7

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

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

Daniel Larson也有一篇关于CAS文章,其中详细介绍了差异。

===============>>#6 票数:6

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

===============>>#7 票数:3

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

  ask by FantaMango77 translate from so

未解决问题?本站智能推荐:

1回复

何时使用GAC?

我是新手使用GAC,我正在尝试处理你应该和不应该使用它的时间。 这是我的情况: 我开发的软件主要是另一个商业产品的插件,以便产品将我的产品加载到它的代码中。 我开发了几个由我的所有应用程序(例如我的许可证模块)使用的程序集。 这些库的.dll文件安装到主应用程序目录,以便父程序从那里
3回复

GAC,还是GAC?

我有一个用ASP.NET 3.5编写的数据访问层(DAL),它使用Microsoft模式和实践库(以下简称P&P)来完成数据访问。 我安装了P&P并且它驻留在我的GAC中,因此,从逻辑上讲, 我的DAL在GAC中引用了它 。 因此,P&P库永远不会被下拉到我的DAL的bin文件夹中。
7回复

我为什么不使用GAC?

在这一行堆栈流程中提出了一些问题,例如使用GAC的优点和缺点以及何时何时不安装到GAC? 和几个人问它在网络上expamle 。 对于不使用GAC,我无法提出任何有说服力的论据。 我确信我很天真,但是接口就像使用GAC然后不使用它有更多好处(例如性能和版本控制问题)。 我为什么不使用
1回复

这是对GAC的有效使用吗?

我们有一个很大的winform应用程序,它安装在用户磁盘上。 我们希望第三方能够编写使用我们某些应用程序功能的应用程序。 因此,我们编写了API.dll,该文件通过从注册表中解析安装目录来与其他一些程序集进行交互。 我们将API.dll作为SDK发送给第三方。 关于第三方应用程序的实际部
6回复

将我的DLL部署到GAC以与ClickOnce App一起使用

我该怎么做? 我不应该有任何理由吗? 我有一个winform ClickOnce应用程序,其中有大约13mbs的DLL不是我的,所以我没有必要/能够定期更新它们。 DevExpress(3),Microsoft ReportViewer,Microsoft SQL Replicat
1回复

使用通配符从GAC取消注册程序集

我有大量要从GAC取消注册的程序集,我宁愿不必一次通过它们。 是否可以在gacutil使用通配符? (或者,一个批处理\\ Powershell脚本)
2回复

.Net / C#-使用GAC的利弊[重复]

这个问题已经在这里有了答案: 十年前关闭。 可能重复: 使用GAC的优点和缺点是什么? 我想听听您有关在.Net应用程序中使用GAC的缺点的
1回复

使用MSI将.NET程序集安装到GAC中

我希望使用安装项目MSI将.NET assembly安装到GAC中。 尽管我对此有一个大致的了解,但在MSI安装它之前是否需要对assembly进行签名;如果是这样,那么在生产环境中,应该如何对assembly进行签名? 即我可以在Visual Studio / InstallShiel
2回复

使用InstallShield将程序集注册到GAC

我必须使用InstallSheild向GAC注册多个程序集,并且我还需要在INSTALLDIR上复制程序集。 最好的方法是什么? 另外我需要调用regasm.exe来进行程序集; 我可以使用InstallShield吗? 我真的需要为每个必须在GAC注册的程序集提供一个新的“组件”吗
1回复

如何强制使用GAC的程序集?

我正在使用使用必须在GAC中的程序集的应用程序。 我的问题是,当我在GAC中更新程序集时,必须重新启动计算机才能获得服务以接管新程序集。 是否有某种方法可以强制使用GAC程序集的服务开始使用新程序集? 使用GAC程序集的服务是SharePoint Timer Services。 我尝