什么时候应该将我的部件部署到GAC中?

我想实际知道我应该在GAC中部署什么样的程序集。

案例1 :如果在我的解决scheme中多个项目使用log4net.dll,那么它应该部署在GAC?

情况2 :如果我在一台机器上部署了多个应用程序,每个使用log4net.dll是否足以将log4net.dll部署到GAC的原因?

问题:我应该在什么时候将我的程序集部署到GAC中?

答: 从来没有

真实的,诚实的,真实的答案: 几乎没有

讨论

只有在机器上的多个应用程序使用程序集时,以及程序集基础性(可能会被多个应用程序使用),签名时以及希望几乎不更新程序集时,才能将内容放入GAC中。 也许再加上一点,那就是当每个应用程序部署一个DLL的多个独立版本实际上是有害的。

后者的一个例子是:假设你有两个独立的应用程序,独立开发和独立部署。 尽pipe如此,他们还是可以相互沟通的。 他们会交换……在本地机器上的.NET Remoting。 如果您在GAC中只有一个程序集,则可以确保这些应用程序能够正常工作。 但是,如果它们每个都有独立版本的程序集,则它们可能无法交换对象。 这是罕见的事情,你可能不需要它。 如果你不确定,那么你不需要它。


基本的GAC场景是.NET基类库。 这些程序集由Microsoft发货。 他们是权威的。 它们是基础性的。 并签字。 他们很less改变。 所有的应用程序应该使用这些DLL的相同副本。 因此,他们属于GAC。

相比之下, 您的应用程序DLL不是来自Microsoft,它们不是基础性的,可能还没有签名。 他们更经常更改,只有less数应用程序(也许只有一个!)使用每个DLL。 没有GAC。


我可以想象一个硬件设备,让我们说一个数码相机,安装一个.NET程序集,以允许可编程性。 这是一个大会适合GAC的场景。 它允许任意.NET应用程序以编程方式访问数码相机。


在我看来,您的log4net示例并不足以certificate将该程序集放入GAC是合理的。 想象一下,其中一个应用程序获取更新的情况下,作为更新的一部分,它使用新版本的log4net。 怎么办? 新的log4net程序集应该放入GAC吗? 可能不会。

在应用程序之间共享DLL的整个想法源于内存和磁盘存储稀缺的前提。 曾几何时,这是真的。 不再是这样了。 如有疑问,请勿使用GAC。

log4net.dll的大小为95KB。 即使你部署了100次,对于今天的硬盘来说也没有什么关系。 我尽量避免GAC出于以下几个原因:

  • 这使得部署变得更困难,您必须告诉安装程序将放入GAC的内容。 我喜欢创build简单的xcopy设置的可能性(复制安装目录,将其删除以卸载)。 因为这很简单 – 但是一旦你不得不把这些东西放到GAC中,它就不能很好地工作。
  • 你必须签署你的程序集。 只有让他们进入GAC ….
  • 只要开发人员在其Visual Studio项目中引用了GAC中的某些内容,当其他开发人员在其PC上打开该解决scheme时,该引用将会丢失。 他必须首先将所需的程序集导入GAC,然后才能成功打开并编译解决scheme。 这是一个真正的PITA。 我希望能够签出,编译和运行没有错误。

你应该考虑joinGAC的唯一一种组装是一个成熟和稳定的组装。 在log4net的情况下,如果您对所使用的版本稳定,成熟感到高兴,而且您不可能很快就更改该版本,请随时将其放入GAC中。

不要试图将图书馆放在可能会改变的GAC中,特别是如果您正在内部开发它们,并且还有进一步改进的空间。 而是将它们部署为专用程序集。

我看到人们传播共享代码的奇迹。 他们说“啊,我们将通过这个代码更改同时改进20个应用程序”。 问题是,如果你弄错了,你也可以同时销毁20个应用程序。 我看到有人说:“我刚刚推出了网站X.你能检查网站AW,以确保他们仍然工作?”。

私有程序集可能是一件痛苦的事情,但是你可能面临的问题受限于它们所针对的特定应用程序。 如果您不能100%确定某个程序集不稳定和成熟,请不要将其放在GAC中。

相信我,你会睡得更好。

您所描述的是将一个程序集放到GAC中足够体面的情况。 说实话,我会尽量避免它。 有了GAC,您不得不担心强大的命名和信任程序集以及特定的程序集版本。 如果你没有明确的理由需要这些。 为每个项目多次部署dll同样简单。

我知道这不利于存储同一段代码等的多个副本,但我总是发现,只是为了避免使用GAC。 当我使用它时,GAC一直很麻烦,因为如果GAC具有项目的所有正确的组件(因为组件可以引用其他程序集),您不必担心。 当你不使用GAC的时候,去“容易吗? “是的,他们在应用程序文件夹。”

我唯一觉得有用的是当我不得不build立一个SharePoint Services WSS 2.0。 我在更新configuration部分时遇到了一个问题,即允许信任很麻烦(因为公司策略),并将其置于GAC中,以使其完全可信。 这是非常罕见的情况。