注册使用GAC—Global Assembly Cache(.NET)
本文将一些资料进行整理,后面附带Demo。
1、什么是GAC?GAC解决什么问题?
GAC全称为: Global Assembly Cach(全局程序集缓存),你可以在你的电脑的系统盘如:C:\Windows\assembly\看到目前计算机上安装的GAC。
举一个最简单的例子,很多初学.NET的开发人员进行数据访问都是从SqlHelper.cs开始的,SqlHelper是一个数据访问对象,提供对数据库操作的各种方法,名字大概是学从PetShop吧,样子大概是这个样子, 又或是这个样子,且不管长啥样,如果部署在服务器上的多个应用都使用此对象,那么基本上会有下面几种类似的处理方法:
(1)将此类直接拷贝到项目中使用;
(2)建一个类库项目,包含此类,然后编译为dll,再在应用中添加引用以使用此程序集中的SqlHelper;
(3)将(2)中的dll注册为GAC,直接在应用中使用,就像使用System.IO、System.Net一样 ;
当SqlHelper.cs更新后,对于(1)和(2)你可能会感觉到非常痛苦,因为要逐个应用去替换,而对于(3)则简单多了,只需要将编译后的dll重新注册到GAC就可以了。
记得在MSDN曾经看到过一句话,说是“.NET程序集解决了DLL Hell”的问题。
说这里,先说个故事:有一天,一个朋友的同事问我,“写过动态链接库吗?”, 我一时竟然没想起是什么,平常说dll太多了,几乎都忘记“动态链接库”这几个字了,不过还好,脑子里还有抹不去的记忆。
“.NET程序集解决了DLL Hell”关键一点就是相同名称而不同版本的程序集可以共存,打开Assembly所在目录,如:C:\Windows\assembly,看一下就比较清楚了。
可以思考一下,为什么同一系统中可以安装多个版本的.NET Framework、Visual Studio;而有些软件是不行的,只能存在唯一版本,大概就是这个道理。
2、将DLL注册到GAC
(1)创建DLL:新建一个类库项目,名称为GACDemo,再添加一个类,如:
namespace GACDemo
{
public class Function
{
//计算字符串长度,中文及全角算1,其它算0.5
public static int GetStringLength(string text)
{
int Len = 0;
//记录非中文、非全角字符为0.5个长度
float charLen = 0;
char[] chars = text.ToCharArray();
for (int i = 0; i < chars.Length; i++)
{
int charLength = Encoding.UTF8.GetByteCount(chars[i].ToString());
if (charLength == 3)
{
Len++;
}
else
{
if (charLen == 0.5)
{
charLen = 0;
}
else
{
charLen = 0.5f;
Len++;
}
}
}
return Len;
}
}
}
右击项目,有菜单中选择属性,按如下操作生成强命名Key (GAC中的Assembly必须是strong-name的 )
然后编译,之前我注册过一次,版本为1.0.0.0,编译之前,我将版本修改为了2.0.0.0。
(2)注册
以管理员身份运行命令行
进入到类库项目的bin/debug目录,执行gacutil -if gacdemo.dll
查看 C:\Windows\assembly
两个版本并存。
3、在ASP.NET中使用GAC
这个就简单了,新建一个ASP.NET网站,添加引用,写如下测试代码

using GACDemo;
namespace gacwebdemo
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Function.GetStringLength("hello"));
}
}
}
编译网站。
在IIS中发布网站:
VS2008直接右击项目发布网站。
VS2010右击网站点击发布,选择文件系统。
发布后的文件目录:
然后在IIS中发布网站(这里是IIS7):
然后浏览default.aspx,看到输出的结果是3。
其它参考资料:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述