C#面试题更新 2026-08-03

在 .NET 环境下,全局程序集缓存(GAC)的概念是什么?它通常被用于哪些场景,以及开发者应该怎样在项目中引用或部署程序集到 GAC?

考察说明

考查对 .NET 程序集部署和版本管理机制的理解。

回答思路

  1. 【回答框架 1】GAC 是 .NET 中存放由多个应用共享的程序集的机器级缓存,位于系统目录(如 Windows 的 assembly 或 Windows\Microsoft.NET\assembly)。其核心作用是通过强名称唯一标识程序集,避免 DLL 冲突,支持版本控制,使不同应用能使用同一程序集的不同版本。
  2. 【回答框架 2】使用 GAC 的主要场景包括:需要被多个应用共享的程序集(如第三方公共库)、需要放置于 GAC 以便 COM 互操作或 ASP.NET 直接引用的程序集,以及需要系统级安全策略管理的程序集。通常仅当程序集必须被多应用共享时才部署到 GAC,否则应使用应用本地部署。
  3. 【回答框架 3】向 GAC 安装程序集的常用工具是 gacutil.exe(如 gacutil /i MyAssembly.dll),或使用 Windows Installer 进行部署。安装前程序集必须具有强名称(即使用 sn.exe 生成的密钥对签名)。引用时,可直接在项目中添加对该程序集的引用,.NET 运行时在解析程序集时会优先从 GAC 查找带强名称的程序集。
  4. 【回答框架 4】卸载程序集可使用 gacutil /u 指定程序集名称。GAC 的存在要求程序集强命名,而强命名只保证唯一标识,不保证代码安全性。对于非共享的应用程序私有程序集,部署到应用目录即可,避免不必要的 GAC 安装。
  5. 【回答框架 5】管理 GAC 时需要注意 .NET Framework 和 .NET Core(或 .NET 5+)的差异:在 .NET Core 中,GAC 概念已被放弃,共享框架成为主要方案,程序集通常通过 NuGet 包和运行时包存储,不再使用 GAC。但旧版 .NET Framework 上仍沿用上述机制。
  6. 【关键点 1】GAC 是机器级缓存,用于共享带强名称的程序集,解决 DLL 冲突并提供版本隔离。
  7. 【关键点 2】将程序集放入 GAC 必须先给它签名强名称,常用 gacutil /i 命令安装,gacutil /u 卸载。
  8. 【关键点 3】GAC 仅适用于 .NET Framework;.NET Core/.NET 5+ 使用共享框架和 NuGet,不再依赖 GAC。
  9. 【关键点 4】若非多应用共享需求,应避免使用 GAC,采用应用本地部署更简单灵活。
  10. 【易错点 1】强名称仅保证唯一标识,不提供安全保证,不能误以为强命名程序集更安全。
  11. 【易错点 2】不能将私有程序集或非强名称程序集安装到 GAC,否则会引发加载异常。
  12. 【易错点 3】在 .NET Core/.NET 5+ 中继续依赖 GAC 属于过时做法,应改用共享框架或 NuGet 包管理。