註冊使用GAC【轉載】

一、什麼是GAC?GAC解決什麼問題? html

GAC全稱爲: Global Assembly Cach(全局程序集緩存),你能夠在你的電腦的系統盤如:C:\Windows\assembly\看到目前計算機上安裝的GAC。web

 

GAC的做用是能夠存儲一些有多個應用都要用到的公共的Assembly(程序集),例如System.Data、System.Windows.Forms等。這樣,多個應用就能夠從GAC中取得 Assembly,而不須要在全部應用中把要用到的Assembly都拷貝到應用程序的相關目錄下面(好比:Windows應用程序的Debug目錄,ASP.NET的bin目錄)。

 

舉一個最簡單的例子,不少初學.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」的問題。spa

 

說這裏,先說個故事:有一天,一個朋友的同事問我,「寫過動態連接庫嗎?」, 我一時居然沒想起是什麼,日常說dll太多了,幾乎都忘記「動態連接庫」這幾個字了,不過還好,腦子裏還有抹不去的記憶。命令行

 

「.NET程序集解決了DLL Hell」關鍵一點就是相同名稱而不一樣版本的程序集能夠共存,打開Assembly所在目錄,如:C:\Windows\assembly,看一下就比較清楚了。debug

 

能夠思考一下,爲何同一系統中能夠安裝多個版本的.NET Framework、Visual Studio;而有些軟件是不行的,只能存在惟一版本,大概就是這個道理。 

 

二、將DLL註冊到GAC 

(1)建立DLL:新建一個類庫項目,名稱爲GACDemo,再添加一個類,如:

複製代碼
using  System.Text;

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

 

兩個版本並存。 

三、在ASP.NET中使用GAC 

這個就簡單了,新建一個ASP.NET網站,添加引用,寫以下測試代碼

複製代碼
using  System;
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。

 

原文地址:http://www.cnblogs.com/Ferry/archive/2010/12/17/1908817.html

相關文章
相關標籤/搜索