2009-08-12 36 views
130

Chỉ cần tìm một cái nhìn tổng quan ngắn về GAC cho một giáo dân, không phải là một liên kết xin vui lòng.GAC trong .NET là gì?

+9

Bạn có thể giải thích tại sao câu trả lời được liên kết như MSDN hoặc Wikipedia không phù hợp với những gì bạn muốn? –

+0

Bạn có phản ứng với một thông báo lỗi trong một số ứng dụng của người dùng không? – Jeff

+47

@JB King: Tôi thích nghe nó theo những thuật ngữ đơn giản từ một người có kinh nghiệm với .NET chứ không phải là một đặc tả kỹ thuật hoặc một bài viết bí truyền. – Nosrama

Trả lời

125

Đúng vậy, về cơ bản đó là cách để giữ cho các tệp DLL có thể truy cập được trên toàn cầu mà không phải lo lắng về xung đột. Không có thêm DLL Hell. Mỗi kiến ​​trúc và phiên bản đều có nơi ở riêng.

Nó cũng được nó theo cách riêng để duyệt nó trong Explorer, vì vậy nếu bạn đi đến

C: \ Windows \ lắp ráp

Trong Windows Explorer nó sẽ liệt kê tất cả các file DLL.

Nhưng nếu bạn cháy lên cmd, bạn có thể thấy nó thực sự có cấu trúc:

 
C:\Users\tritter>cd C:\Windows\assembly 

C:\Windows\assembly>dir 

Directory of C:\Windows\assembly 

07/20/2009 02:18 PM <DIR>   GAC 
06/17/2009 04:22 PM <DIR>   GAC_32 
06/17/2009 04:22 PM <DIR>   GAC_64 
06/17/2009 04:22 PM <DIR>   GAC_MSIL 
...snip... 
       0 File(s)    0 bytes 
       9 Dir(s) 90,538,311,680 bytes free 

C:\Windows\assembly>cd GAC_64 

C:\Windows\assembly\GAC_64>dir 

Directory of C:\Windows\assembly\GAC_64 

06/17/2009 04:22 PM <DIR>   . 
06/17/2009 04:22 PM <DIR>   .. 
01/19/2008 09:54 AM <DIR>   blbproxy 
...snip... 
01/19/2008 09:54 AM <DIR>   srmlib 
01/19/2008 06:11 AM <DIR>   System.Data 
01/19/2008 06:11 AM <DIR>   System.Data.OracleClient 
...snip... 
       0 File(s)    0 bytes 
       34 Dir(s) 90,538,311,680 bytes free 

C:\Windows\assembly\GAC_64>cd System.Data 

C:\Windows\assembly\GAC_64\System.Data>dir 
Directory of C:\Windows\assembly\GAC_64\System.Data 

01/19/2008 06:11 AM <DIR>   . 
01/19/2008 06:11 AM <DIR>   .. 
04/11/2009 12:20 PM <DIR>   2.0.0.0__b77a5c561934e089 
       0 File(s)    0 bytes 
       3 Dir(s) 90,538,311,680 bytes free 

C:\Windows\assembly\GAC_64\System.Data>cd 2.0.0.0__b77a5c561934e089 

C:\Windows\assembly\GAC_64\System.Data\2.0.0.0__b77a5c561934e089>dir 

Directory of C:\Windows\assembly\GAC_64\System.Data\2.0.0.0__b77a5c561934e089 

04/11/2009 12:20 PM <DIR>   . 
04/11/2009 12:20 PM <DIR>   .. 
04/11/2009 12:12 PM   3,008,512 System.Data.dll 
       1 File(s)  3,008,512 bytes 
       2 Dir(s) 90,538,311,680 bytes free 

C:\Windows\assembly\GAC_64\System.Data\2.0.0.0__b77a5c561934e089> 

Ở đây bạn có thể thấy phiên bản 2.0.0.0__b77a5c561934e089 của System.Data.

Một DLL được xác định bởi 5 phần:

  1. Tên
  2. Version
  3. Kiến trúc
  4. Văn hóa
  5. Public Key

Mặc dù 3 đầu tiên nói chung là lớn những người.

+8

Bạn nhận được +1 để đề cập rằng đó là một cách mới để có tham chiếu toàn cục .dll trong khi tránh "dll địa ngục". (Nó sẽ là một câu trả lời tốt hơn nếu bạn đi vào một chút xíu về địa ngục và cách GAC đi xung quanh nó ... bạn đã có phác thảo cơ bản về nó ... nhưng tôi sẽ chỉ thắt chặt các cấu trúc thư mục inset, và thêm một chút về cách dll được xác định và duy nhất) Không có nghĩa là âm thanh quá tiêu cực ... Tôi đã cung cấp cho 1! – Beska

+0

Chỉ cần không cung cấp liên kết:]. Câu hỏi về câu trả lời của bạn là "Kiến trúc" được chỉ định bởi tên thư mục "GAC_64"? Và Văn hóa trong trường hợp này có trống không - giá trị sẽ nằm giữa dấu gạch dưới "__"? –

+0

GAC chỉ tồn tại cho các ứng dụng .NET không? –

54

Global Assembly Cache

Mỗi máy tính mà phổ biến runtime ngôn ngữ được cài đặt có một máy rộng đang nhớ cache gọi là Global Assembly Cache . Bộ lưu trữ lắp ráp lưu trữ lắp ráp toàn cầu được chỉ định cụ thể để chia sẻ bởi một số ứng dụng trên máy tính .

Bạn nên chia sẻ hội đồng bằng cách cài đặt chúng vào bộ nhớ cache lắp ráp toàn cầu chỉ khi bạn cần. Theo nguyên tắc chung, hãy giữ riêng phụ kiện phụ thuộc và định vị các hội đồng trong ứng dụng thư mục trừ khi chia sẻ một assembly được yêu cầu một cách rõ ràng. Ngoài ra, không cần thiết phải cài đặt hội đồng vào bộ nhớ toàn cầu bộ nhớ cache để làm cho chúng có thể truy cập được vào mã COMtương tác hoặc không được quản lý.

Những thứ MSDN chứa có thể làm bạn ngạc nhiên ... bạn thường có thể đọc nó như một bài viết. Các bit đơn giản và quan trọng nhất ở trên cùng, chi tiết phức tạp sâu hơn. Nó chắc chắn giải thích nó tốt hơn tôi có thể.

Lưu ý rằng Visual Studio hiển thị tất cả các tệp DLL trong GAC trong tab .NET của cửa sổ Tham chiếu. (Nhấn chuột phải vào một dự án trong Solution Explorer và chọn Add Reference.) Điều này sẽ cho bạn một ý tưởng dễ hiểu hơn.

+0

Ông nói không có liên kết, muốn có một lời giải thích bằng lời nói của riêng bạn. – user142350

+0

Anh ấy không có liên kết nào ... –

+0

Trong phiên bản gốc của bài đăng của anh ấy (tôi tin rằng anh ấy đã chỉnh sửa nhanh), điều đó không được chỉ định! – Noldorin

19

Thư viện DLL tập trung.

61

GAC = toàn cầu hội cache

Hãy phá vỡ nó xuống:

  • toàn cầu - áp dụng cho toàn bộ máy
  • lắp ráp - những gì NET gọi của nó mã thư viện (DLL)
  • bộ nhớ cache - nơi lưu trữ mọi thứ để truy cập nhanh/phổ biến hơn

Vì vậy, GAC phải là nơi lưu trữ các thư viện mã để chúng có thể truy cập được đối với tất cả các ứng dụng đang chạy trên máy.

5

Giống như đăng ký COM được thực hiện đúng, đối với các tệp vật lý cũng như thông tin về giao diện và vị trí của chúng. Trong COM, các tệp ở khắp mọi nơi, với siêu dữ liệu tập trung. GAC tập trung bắn.

5

GAC (Global Assembly Cache) là nơi tất cả các phiên bản .NET được chia sẻ đều nằm.

6

Bộ đệm ẩn toàn cục (GAC) là một thư mục trong thư mục Windows để lưu trữ các hội đồng .NET được chỉ định cụ thể để chia sẻ bởi tất cả các ứng dụng được thực hiện trên hệ thống. Các hội đồng có thể được chia sẻ giữa nhiều ứng dụng trên máy bằng cách đăng ký chúng trong bộ đệm toàn cục (GAC). GAC là một máy rộng bộ đệm cục bộ của các assembly được duy trì bởi .NET Framework.

6

Ứng dụng Exe, trước tiên, tham chiếu từ thư mục hiện tại đến thư mục phụ. Và sau đó, thư mục hệ thống. Thư mục hệ thống VS6.0 là ..windows/system32. Thư mục hệ thống .NET giống như đường dẫn GAC bên dưới.

  1. GAC đường

    1) C: \ Windows \ hội (đối với .NET 2.0 ~ 3,5)

    2) C: \ WINDOWS \ Micorosoft.NET \ lắp ráp (đối với .NET 4.0)

  2. làm thế nào để cài đặt một assembly vào GAC (as Administrator)

    1) Kéo và Thả

    2) Sử dụng GacUtil.exe với Visual Studio Command Prompt

    gacutil -i [Path][Assembly Name].dll 
    
    • Lưu ý: Để cài đặt một assembly vào GAC, lắp ráp phải được được đặt tên mạnh. Nếu không, bạn nhận được một lỗi như thế này: Không thêm lắp ráp vào bộ nhớ đệm: Cố gắng lắp đặt một cụm mà không có tên mạnh.
  3. Làm thế nào để gỡ bỏ cài đặt một lắp ráp từ GAC (as Administrator)

    gacutil -u [Assembly Name], Version=1.0.0.0, PublickeyToken=7896a3567gh 
    
    • Lưu ý: không có gia hạn, .dll. Phiên bản và PublickeyToken có thể được bỏ qua và được kiểm tra trong hội đồng GAC.