注冊(cè)使用GAC—Global Assembly Cache(.NET)
本文將一些資料進(jìn)行整理,后面附帶Demo。
1、什么是GAC?GAC解決什么問(wèn)題?
GAC全稱為: Global Assembly Cach(全局程序集緩存),你可以在你的電腦的系統(tǒng)盤(pán)如:C:\Windows\assembly\看到目前計(jì)算機(jī)上安裝的GAC。
舉一個(gè)最簡(jiǎn)單的例子,很多初學(xué).NET的開(kāi)發(fā)人員進(jìn)行數(shù)據(jù)訪問(wèn)都是從SqlHelper.cs開(kāi)始的,SqlHelper是一個(gè)數(shù)據(jù)訪問(wèn)對(duì)象,提供對(duì)數(shù)據(jù)庫(kù)操作的各種方法,名字大概是學(xué)從PetShop吧,樣子大概是這個(gè)樣子, 又或是這個(gè)樣子,且不管長(zhǎng)啥樣,如果部署在服務(wù)器上的多個(gè)應(yīng)用都使用此對(duì)象,那么基本上會(huì)有下面幾種類似的處理方法:
(1)將此類直接拷貝到項(xiàng)目中使用;
(2)建一個(gè)類庫(kù)項(xiàng)目,包含此類,然后編譯為dll,再在應(yīng)用中添加引用以使用此程序集中的SqlHelper;
(3)將(2)中的dll注冊(cè)為GAC,直接在應(yīng)用中使用,就像使用System.IO、System.Net一樣 ;
當(dāng)SqlHelper.cs更新后,對(duì)于(1)和(2)你可能會(huì)感覺(jué)到非常痛苦,因?yàn)橐饌€(gè)應(yīng)用去替換,而對(duì)于(3)則簡(jiǎn)單多了,只需要將編譯后的dll重新注冊(cè)到GAC就可以了。
記得在MSDN曾經(jīng)看到過(guò)一句話,說(shuō)是“.NET程序集解決了DLL Hell”的問(wèn)題。
說(shuō)這里,先說(shuō)個(gè)故事:有一天,一個(gè)朋友的同事問(wèn)我,“寫(xiě)過(guò)動(dòng)態(tài)鏈接庫(kù)嗎?”, 我一時(shí)竟然沒(méi)想起是什么,平常說(shuō)dll太多了,幾乎都忘記“動(dòng)態(tài)鏈接庫(kù)”這幾個(gè)字了,不過(guò)還好,腦子里還有抹不去的記憶。
“.NET程序集解決了DLL Hell”關(guān)鍵一點(diǎn)就是相同名稱而不同版本的程序集可以共存,打開(kāi)Assembly所在目錄,如:C:\Windows\assembly,看一下就比較清楚了。
可以思考一下,為什么同一系統(tǒng)中可以安裝多個(gè)版本的.NET Framework、Visual Studio;而有些軟件是不行的,只能存在唯一版本,大概就是這個(gè)道理。
2、將DLL注冊(cè)到GAC
(1)創(chuàng)建DLL:新建一個(gè)類庫(kù)項(xiàng)目,名稱為GACDemo,再添加一個(gè)類,如:
namespace GACDemo
{
public class Function
{
//計(jì)算字符串長(zhǎng)度,中文及全角算1,其它算0.5
public static int GetStringLength(string text)
{
int Len = 0;
//記錄非中文、非全角字符為0.5個(gè)長(zhǎng)度
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;
}
}
}
右擊項(xiàng)目,有菜單中選擇屬性,按如下操作生成強(qiáng)命名Key (GAC中的Assembly必須是strong-name的 )

然后編譯,之前我注冊(cè)過(guò)一次,版本為1.0.0.0,編譯之前,我將版本修改為了2.0.0.0。
(2)注冊(cè)
以管理員身份運(yùn)行命令行
進(jìn)入到類庫(kù)項(xiàng)目的bin/debug目錄,執(zhí)行g(shù)acutil -if gacdemo.dll
查看 C:\Windows\assembly
兩個(gè)版本并存。
3、在ASP.NET中使用GAC
這個(gè)就簡(jiǎn)單了,新建一個(gè)ASP.NET網(wǎng)站,添加引用,寫(xiě)如下測(cè)試代碼

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"));
}
}
}
編譯網(wǎng)站。
在IIS中發(fā)布網(wǎng)站:
VS2008直接右擊項(xiàng)目發(fā)布網(wǎng)站。
VS2010右擊網(wǎng)站點(diǎn)擊發(fā)布,選擇文件系統(tǒng)。
發(fā)布后的文件目錄:
然后在IIS中發(fā)布網(wǎng)站(這里是IIS7):
然后瀏覽default.aspx,看到輸出的結(jié)果是3。
其它參考資料:
posted on 2010-12-17 11:09 Ferry 閱讀(17081) 評(píng)論(3) 收藏 舉報(bào)

浙公網(wǎng)安備 33010602011771號(hào)