咨询.NET DLL注册目录C:\Windows\assembly与C:\Windows\Microsoft.NET\assembly的区别
C:\Windows\assembly 与 C:\Windows\Microsoft.NET\assembly 的核心区别
嘿,这个问题问得特别实在——不少刚深入.NET部署的开发者都会被这两个目录绕晕,我给你把关键差异拆解明白:
1. 对应的.NET Framework版本范围
- C:\Windows\assembly:这是.NET Framework 1.0到3.5版本的**全局程序集缓存(GAC)**存储位置。这个时期的GAC采用了特殊的合并视图,你在资源管理器里打开它时,看到的不是普通文件夹结构,而是一个专门的GAC管理界面,显示所有注册的强命名程序集及其版本、公钥令牌等信息。
- C:\Windows\Microsoft.NET\assembly:从.NET Framework 4.0开始,微软重构了GAC的存储结构,这个目录就是新版GAC的家。它针对不同CPU架构拆分了子目录:
GAC_32(32位程序集)、GAC_64(64位)、GAC_MSIL(与平台无关的中间语言程序集),你直接打开就能看到普通的文件夹层级,更直观。
2. 程序集加载逻辑
- 旧版GAC(
C:\Windows\assembly):仅被.NET Framework 3.5及更早版本的CLR(公共语言运行时)识别,应用会从这里加载共享的强命名程序集,避免重复部署。 - 新版GAC(
C:\Windows\Microsoft.NET\assembly):由.NET Framework 4.x及以上版本的CLR使用,4.x的CLR完全不会去旧GAC里找程序集,两者是完全隔离的——这也是为什么你可能会在两个目录里看到同名但不同版本的.NET DLL。
3. 日常使用场景
- 如果你维护的是老项目(基于.NET 2.0/3.0/3.5),涉及到共享程序集部署,会用到
C:\Windows\assembly,通常用旧版本的gacutil.exe来注册程序集。 - 对于.NET 4.0及之后的项目,共享程序集要部署到
C:\Windows\Microsoft.NET\assembly对应的子目录里,新版gacutil.exe也会默认把程序集放到这里。
另外补充一点:.NET Core/.NET 5+已经彻底抛弃了GAC机制,它们的程序集都是随应用部署或者通过NuGet管理,不会用到这两个目录啦。
内容的提问来源于stack exchange,提问作者Dominota
相关产品推荐
相关产品推荐

