在这一行堆栈流程中提出了一些问题,例如 使用GAC的优点和缺点 以及何时何时不安装到GAC?和几个人问它在网络上expamle.对于不使用GAC,我无法提出任何有说服力的论据.我确信我很天真,但是接口就像使用GAC然后不使用它有更多好处(例如性能和版本控制问题).
我为什么不使用GAC?
Chris Sells可能是避免GAC的最佳理由,您可以:
这归结为任何共享的更新点,无论是COM CLSID,Windows\system32还是GAC,都是危险的,应该避免.这就是为什么首选的.NET部署方案是"xcopy部署",即拥有您自己的每个DLL的私有副本,您可以使用其余的应用程序进行测试和部署.
"啊哈!" 你说."GAC支持多个版本的程序集!当foo.dll更新到v1.1时,v1.0就位于它旁边,这样你的应用程序就不会破坏!" 当然,这绝对是真的.但如果是这样的话,你为什么关心?我的意思是,如果有一个新的组件可用,但你的应用程序没有提起它,它有什么区别?
"啊哈再次!你说,'我可以把出版商政策进入GAC与我组装一起,使应用程序的自动更新!’这是真的了,但是现在,像所有的旧机器范围的代码替换策略,你有一个很棒的责任:确保接近0%的应用程序,无论你是否知道,都不要破坏.这是一个非常棒的责任,需要MS数百人年.NET Framework的每个新版本.即使有数百个人年的测试,我们仍然不能总是正确的.如果这是你愿意忍受的测试责任,我很钦佩你.就个人而言,我没有道德的毅力来承担这种负担.
我们有一个应用程序,在任何给定时间加载了50多个.NET程序集,我们不使用GAC.我认为如果您必须同时运行多个版本的应用程序,GAC最有用,每个版本都需要加载同一共享库的不同版本.
即使这样,如果两个应用程序版本位于不同的目录中,那么只要您将它们的二进制文件分开,您仍然不需要GAC.
我一直认为对于制作SDK/API的人来说它更有用,其中SDK的不同版本可以由多个应用程序加载并且协调一致.因此,如果您在这艘船上,那么GAC可能会有意义.
有一些边缘情况需要GAC(我认为在某些情况下.NET COM +组件需要在GAC中),但我认为这些只占案例的一小部分.