2009-01-31 27 views
40

Khi nào bạn nên cài đặt vào GAC và khi nào bạn không nên? (Tôi đang giới thiệu, thực sự, để cài đặt trên máy của khách hàng khi họ đã mua (các) sản phẩm của chúng tôi).Khi nào và khi nào không cài đặt vào GAC?

  1. Tôi có một phiên bản chỉ được sử dụng với một ứng dụng của tôi (GAC hoặc không có GAC)?

  2. Tôi có một hội đồng mà tất cả các ứng dụng của tôi chia sẻ (GAC hoặc không có GAC)?

  3. Tất cả các ứng dụng của tôi có thể sử dụng các phiên bản khác nhau của lắp ráp của tôi (GAC hoặc không có GAC)?

Đây là ba trường hợp ... nhưng tôi chắc chắn có nhiều trường hợp hơn. Tôi không nhất thiết phải tìm câu trả lời cho chỉ ba câu hỏi này.

câu hỏi tương tự: What are the advantages and disadvantages of using the GAC?

Trả lời

35

Hướng dẫn chung MS

  1. không
  2. không
  3. không

GAC thực sự là một kho lưu trữ cho Microsoft thư viện chung NET. Có, họ cho phép các nhà phát triển sử dụng nó quá, nhưng như một quy tắc của ngón tay cái, nếu bạn không cần GAC, không sử dụng nó. giữ cho mọi thứ đơn giản và địa phương nếu nó không đau.

  • tôi sẽ xem xét GAC chỉ vì lý do hiệu suất, ví dụ nếu bạn có một số hội rất lớn, hãy cố gắng đặt chúng vào GAC và NGEN họ. Nó sẽ làm tăng đáng kể hiệu suất. Microsoft thực hiện nó cho tất cả các assembly .NET framework chuẩn trong khi cài đặt (bây giờ bạn đã biết tại sao quá trình cài đặt lại mất quá nhiều thời gian). Paint.NET cũng làm như vậy (để cải thiện thời gian khởi động ứng dụng của họ). Tuy nhiên, hầu hết chúng ta không làm việc trên các khuôn khổ lớn hoặc đối thủ cạnh tranh photoshop, do đó, phần lớn thời gian, hiệu suất đạt được từ việc lắp ráp trong GAC là tối thiểu. Không đáng để từ bỏ việc triển khai x-copy đơn giản.

  • Một số nhà phát triển có thể sử dụng GAC để đảm bảo rằng người dùng không đủ đặc quyền không thể xóa hoặc sửa đổi các hội đồng của họ.

  • Đối với những người khác, có thể vì lý do phiên bản nhưng ở đây bạn thực sự nên xem xét lại. Tôi sẽ không lặp lại những gì đã được nói, you can read here why.

Và đừng quên rằng một khi bạn muốn triển khai vào GAC, trình cài đặt của bạn sẽ cần quyền quản trị, bạn có thể khá nhiều quên nhấp một lần triển khai, vv ...

+0

Nếu tôi đang xây dựng phần mềm máy chủ, của riêng mình ... thì việc đưa nó vào GAC sẽ giúp hiệu suất? – Jason

+0

Hội đồng địa phương (không được đặt trong GAC) có thêm chi phí nhưng chỉ trong khi khởi động. Sau đó, có NGEN vs JIT. Các hội đồng NGENed (nhưng chỉ những người trong GAC) mới có thể cải thiện thời gian khởi động nhưng các hội đồng JITed phải có hiệu suất thời gian chạy tốt hơn - theo lý thuyết. Bạn sẽ cần phải đo lường điều này trên ứng dụng của riêng bạn. –

0

đầu tiên nếu bạn là cài đặt nó trên máy khách, bạn sẽ cần phải thêm một hành động tùy chỉnh để cài đặt ứng dụng trong GAC và một ứng dụng khác khi gỡ bỏ.

về trường hợp A chắc chắn không phải GAC

về trường hợp B nếu thư viện của bạn sẽ được thay đổi liên tục, bạn sẽ cần phải thêm mỗi phiên bản của hội đồng vào mọi gấc và cập nhật để lắp ráp xảy ra

về trường hợp C bên cạnh thực hiện cho phép bạn chạy các phiên bản lắp ráp khác nhau và bạn không cần phải thêm bất cứ điều gì để phân biệt các phiên bản.

chỉ sử dụng nếu bạn thực sự cần phải

8

Nếu bạn đang cài đặt các ứng dụng web asp.net và bạn là chủ sở hữu và có toàn quyền điều khiển máy tính, sau đó trong một số trường hợp nó có thể làm cho tinh thần đặt hội đồng của bạn , bạn dự định chia sẻ trên các trang web/trường hợp web trong bộ nhớ cache lắp ráp chung.

Bạn có thể cải thiện đáng kể thời gian tải ban đầu và sử dụng bộ nhớ của ứng dụng trên các máy chủ có nhiều phiên bản của cùng một ứng dụng ASP.NET nếu bạn đặt các assembly trong GAC. Ít nhất tôi đã thấy điều này trên các máy chủ của chúng tôi với hàng chục cài đặt.

+0

Tại sao 'sử dụng bộ nhớ' bị ảnh hưởng? Chúng tôi đang nhìn thấy những thứ tương tự, và heck ... Tôi không quan tâm rằng câu hỏi này là 9 tuổi! – BlackjacketMack

3

Đây là liên kết từ Chris Sells gọi là "Tránh GAC"

https://sellsbrothers.com/12503

Lời giải thích là khá dài, nhưng trong ngắn hạn, hai trường hợp ông xác định là

  1. Sửa quan trọng lỗi mà không chạm vào các ứng dụng bị ảnh hưởng (và không phá vỡ bất cứ điều gì!)

  2. Loại chia sẻ tại thời gian chạy betwe các hội đồng được triển khai riêng lẻ

Lưu ý: Có một chuỗi thảo luận rất dài at the end of Chris's the post, danh sách các nhận xét rất hay.

0

Chỉ cần cài đặt vào GAC nếu rất nhiều và nhiều ứng dụng web trên cùng một máy chủ sẽ chia sẻ chính xác cùng một thư viện. Ví dụ, trên một máy chủ Sharepoint có thể có hàng trăm trang web mà tất cả đều cần chia sẻ cùng một phần web, vì vậy trong trường hợp này, việc triển khai phần web được biên dịch vào GAC là hợp lý.

14

trường hợp hữu ích cho GAC:

  • COM-callable mã - tức là bạn muốn một số mã non-.NET để có thể truy cập vào bạn mà không phiền với dlls vv
  • Serviced Components (COM +)
  • Nếu bạn đang viết mã quá phổ biến, điều đó thực sự có ý nghĩa khi sử dụng GAC - chủ yếu là các thành phần của .NET framework, v.v.
  • Nếu bạn muốn sử dụng NGEN để tiền JIT mã số

Ngoài ra, tôi có xu hướng tránh GAC như bệnh dịch hạch. Nó dễ dàng hơn nhiều để triển khai các dll cần thiết với ứng dụng của bạn thông qua robocopy v.v. điều này cho phép cách ly triển khai dễ dàng.

6

Nếu bạn đang vận chuyển thư viện có thể tái sử dụng bao gồm nhiều tập hợp, nhưng chỉ một vài trong số chúng tạo thành mặt tiền, bạn có thể xem xét cài đặt các hội đồng vào GAC, nếu gói được cài đặt vào máy tính của nhà phát triển.

Hãy tưởng tượng, bạn gửi 6 hội đồng, và chỉ một trong 6 hội đồng này có mặt tiền - tức là 5 khác chỉ được sử dụng bởi mặt tiền. Bạn ship:

  • MyProduct.Facade.dll - đó là thành phần chỉ nhằm mục đích được sử dụng bởi các nhà phát triển
  • MyProduct.Core.dll - được sử dụng bởi MyProduct.Facade.dll, nhưng không có ý định sẽ được sử dụng bởi các nhà phát triển
  • MyProduct.Component1.dll - cùng
  • MyProduct.Component2.dll - cùng
  • ThirdParty.Lib1.dll - thư viện của bên thứ ba sử dụng bởi MyProduct.Component1.dll
  • ThirdParty.Lib2.dll - cùng
  • , vv

phát triển sử dụng dự án của bạn muốn tham khảo chỉ MyProduct.Facade.dll trong các dự án riêng của họ. Nhưng khi dự án của họ chạy, nó phải có khả năng nạp tất cả các assembly mà nó tham chiếu - đệ quy. Làm thế nào điều này có thể đạt được? Nói chung, họ phải có sẵn hoặc trong thư mục Bin, vào trong GAC:

  • Bạn có thể yêu cầu các nhà phát triển để xác định vị trí thư mục cài đặt của bạn và thêm tài liệu tham khảo cho tất cả N hội bạn đặt ở đó. Điều này sẽ đảm bảo chúng sẽ được sao chép vào thư mục Bin để có sẵn trong thời gian chạy.
  • Bạn có thể cài đặt mẫu dự án VS.NET đã chứa 6 tham chiếu này. Một chút phức tạp, vì bạn nên tiêm đường dẫn thực tế đến các hội đồng của bạn vào mẫu này trước khi cài đặt của nó. Điều này có thể được thực hiện chỉ bởi trình cài đặt, vì đường dẫn này phụ thuộc vào đường dẫn cài đặt.
  • Bạn có thể yêu cầu nhà phát triển tạo bước đăng bài đặc biệt sau trong tệp .csproj/.vbproj sao chép các phụ thuộc cần thiết vào thư mục Bin. Những bất lợi tương tự.
  • Cuối cùng, bạn có thể cài đặt tất cả các hội đồng của bạn vào GAC. Trong trường hợp này, các nhà phát triển phải thêm tham chiếu vào MyProduct.Facade.dll từ dự án của họ. Mọi thứ khác sẽ có sẵn trong thời gian chạy anyway.

Lưu ý: tùy chọn cuối cùng không làm bạn làm như vậy trong khi vận chuyển dự án sang máy tính sản xuất. Bạn có thể gửi tất cả các assembly trong thư mục Bin, hoặc cài đặt chúng vào GAC - tất cả đều phụ thuộc vào tất cả mong muốn của bạn.

Vì vậy, giải pháp được mô tả cho thấy lợi thế của việc đưa các hội đồng của bên thứ ba vào GAC trong quá trình phát triển. Nó không liên quan đến sản xuất.

Như bạn có thể thấy, việc cài đặt vào GAC chủ yếu nhằm giải quyết vấn đề vị trí của các cụm được yêu cầu (phụ thuộc). Nếu một hội đồng được cài đặt vào GAC, bạn có thể xem xét nó tồn tại "lân cận" bất kỳ ứng dụng nào. Nó giống như thêm đường dẫn đến .exe vào biến PATH của bạn, nhưng trong "cách quản lý". - tất nhiên, đây là mô tả khá đơn giản;)

Các vấn đề liên quan