Làm thế nào để trích xuất một hội đồng từ GAC?


134

Có một gói tôi phải đối phó với việc cài đặt các cụm lắp ráp trực tiếp vào GAC (ví dụ: ở đâu đó sâu trong% windows% / assembly).

Làm cách nào để trừ tập hợp thực tế (DLL) từ GAC vào hệ thống tệp bình thường?

Cảm ơn.

Câu trả lời:


150

Tôi đã sử dụng lời khuyên từ bài viết này để có được một hội đồng từ GAC.

Nhận DLL ra khỏi GAC

Các tệp DLL một khi được triển khai trong GAC (thường được đặt tại c: \ windows \ assembly) không thể được xem hoặc sử dụng như một tệp DLL bình thường. Họ không thể được tham khảo trực tiếp từ dự án VS. Các nhà phát triển thường giữ một bản sao của tệp DLL gốc và tham chiếu nó trong dự án tại thời điểm phát triển (thiết kế), sử dụng lắp ráp từ GAC trong thời gian chạy dự án.

Trong quá trình thực thi (thời gian chạy) nếu tìm thấy lắp ráp được ký và triển khai trong GAC, CLR sẽ tự động lấy cụm từ GAC thay vì DLL được tham chiếu trong thời gian thiết kế trong VS. Trong trường hợp nhà phát triển đã xóa DLL gốc hoặc không có nó vì một số lý do, có một cách để lấy tệp DLL từ GAC. Thực hiện theo các bước sau để sao chép DLL từ GAC

  1. Chạy bộ đệm / u C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dll

    • shfusion.dll là một DLL mở rộng trình thám hiểm mang lại cái nhìn khác biệt cho thư mục GAC. Việc hủy đăng ký tệp này sẽ xóa trình xem bộ đệm bộ đệm và thư mục GAC sẽ hiển thị như bất kỳ thư mục bình thường nào trong trình thám hiểm.
  2. Mở ra %% Windir% \ assembly \ GAC_MSIL.

  3. Duyệt đến thư mục DLL của bạn vào sâu để tìm DLL của bạn.

  4. Sao chép DLL ở đâu đó trên đĩa cứng của bạn và giới thiệu nó từ đó trong dự án của bạn

  5. Chạy "personas% Windir% \ Microsoft.NET \ Framework \ <. Thư mục phiên bản NET> \ shfusion.dll" để đăng ký lại tệp shfusion.dll và lấy lại giao diện khác biệt ban đầu của GAC.


81
Điều này hoạt động nhưng là một chút phức tạp. Nếu bạn không sợ dấu nhắc lệnh, bạn có thể chỉ cần cd vào thư mục cần thiết và sao chép DLL theo cách đó.
Cheeso

3
Chỉ cần cài đặt TotalCommander, bật tùy chọn để xem tất cả các tệp bị ẩn và bạn có thể lấy mọi phần bạn muốn
Patrick Peters

4
@Andrew, có vẻ như shfusion.dllkhông hỗ trợ DllInstall()điểm vào được gọi regsvr32khi được thông qua /itùy chọn. Bỏ qua tùy chọn đó cho phép đăng ký lại thành phần.
Frédéric Hamidi

9
Bạn có thể bỏ qua bước 1 và 2 và truy cập trực tiếp vào% Windir% \ assembly \ GAC_MSIL và duyệt từ đó.
Christian Fredh

5
@ChristianFredh Chỉ cần một lưu ý: đối với tôi, điều này chỉ có thể được thực hiện trực tiếp từ hộp thoại Run.
xr280xr


84

Mở Dấu nhắc Lệnh và Loại:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Điều này sẽ cung cấp cho bãi chứa của toàn bộ GAC

Thưởng thức!


10
Câu trả lời của Deepak rõ ràng hơn và sử dụng xcopy với các cờ thích hợp.
katbyte

Tôi đánh giá câu trả lời số 1 này vì phải mất 5 giây để có được mọi thứ, sau khi nhấn các vấn đề theo cách tiếp cận từng bước.
FBryant87

24

Đúng.

Thêm khóa đăng ký DisableCacheViewer

Tạo khóa từ mới trong HKLM \ Software \ Microsoft \ Fusion \ với tên DisableCacheViewer và đặt giá trị [DWORD] thành 1.

Quay trở lại Windows Explorer vào thư mục lắp ráp và nó sẽ là chế độ xem hệ thống tệp bình thường.


2
Câu trả lời dưới đánh giá. Cảm ơn!
xr280xr

1
Đây là giải pháp thực sự. Dễ dàng hoàn tác và không cần dòng lệnh.
dùng2920518

16

Tôi nghĩ cách dễ nhất là làm điều đó thông qua dòng lệnh như David đề cập. Thủ thuật duy nhất là không chỉ đơn giản là tại C: \ Windows \ hội. Bạn phải điều hướng đến C: \ Windows \ hội \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [KEY PUBLIC]. Sau đó, bạn có thể thực hiện một bản sao bằng cách sử dụng:

sao chép [ASSEMBLY_NAME] đậm c: \ (hoặc bất kỳ vị trí nào bạn muốn)

Mong rằng sẽ giúp.


13

Cách dễ dàng tôi đã tìm thấy là mở dấu nhắc lệnh và duyệt qua thư mục bạn đề cập cho đến khi bạn tìm thấy DLL bạn muốn - sau đó bạn có thể sử dụng lệnh sao chép để lấy nó ra. Windows Explorer có giao diện đặc biệt "hữu ích" của thư mục này.


Tôi tìm thấy một vấn đề thú vị sáng nay. Tôi đã cập nhật một DLL trong GAC và sử dụng phương thức dòng cmd để sao lưu. Khi tôi cố tải lên DLL mới (cùng số phiên bản), tôi đã gặp một lỗi chỉ biến mất khi tôi tắt cửa sổ cmd. Mất vài phút chửi rủa tôi để tìm hiểu chuyện gì đang xảy ra!
NeilD

11

Mở RUN sau đó gõ %windir%\assembly\GAC_MSIL, điều này sẽ mở dlls của bạn trong chế độ xem thư mục, sau đó bạn có thể điều hướng đến thư mục có tên dll của bạn và mở nó, bạn sẽ tìm thấy tệp dll của mình và sao chép nó dễ dàng


Giải pháp rất dễ dàng. Cảm ơn bạn.
Dblock247

4

Tôi là tác giả của PowerShell GAC . Với PowerShell GAC, bạn có thể trích xuất các cụm từ GAC mà không phụ thuộc vào nội bộ GAC như thay đổi cấu trúc thư mục.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany

3

Bài đăng trên blog MSDN này mô tả ba cách riêng biệt để trích xuất một DLL từ GAC. Một bản tóm tắt hữu ích của các phương pháp cho đến nay được đưa ra.


3

Sử dụng trình duyệt tệp "Total Commander" thay thế.

  1. Bật cài đặt "hiển thị tệp ẩn / hệ thống" trong Total Commander
  2. Duyệt đến "c: \ windows \ assembly"
  3. bản sao

3

Hãy nghĩ rằng tôi đã tìm ra một cách để nhìn vào bên trong GAC mà không cần sửa đổi sổ đăng ký hoặc sử dụng dòng lệnh, powershell hoặc bất kỳ chương trình nào khác:

Tạo một lối tắt mới (đến bất cứ nơi nào). Sau đó sửa đổi các phím tắt để có mục tiêu là:

%windir%\assembly\GAC_MSIL\System

Mở phím tắt này sẽ đưa bạn đến thư mục Hệ thống bên trong GAC (mọi người nên có) và có tác dụng phụ tuyệt vời là cho phép bạn chuyển sang thư mục cao hơn và sau đó duyệt vào bất kỳ thư mục nào khác bạn muốn (và xem các tệp dll, v.v.)

Tôi đã thử nghiệm điều này trên windows 7 và windows server 2012.

Lưu ý: Nó sẽ không cho phép bạn sử dụng mục tiêu đó khi tạo lối tắt nhưng nó sẽ cho phép bạn chỉnh sửa nó.

Thưởng thức!


2

chỉ cần điều hướng đến C: \ Windows tìm thư mục [assembly] nhấp chuột phải và chọn thêm vào lưu trữ

chờ một chút

vola bạn có một tệp lưu trữ chứa tất cả các tập hợp trong GAC của bạn


2

Từ một kịch bản Powershell, bạn có thể thử điều này. Tôi chỉ có một phiên bản lắp ráp trong GAC vì vậy nó hoạt động tốt.

cd "c:\Windows\Microsoft.NET\assembly\GAC_MSIL\"
Get-ChildItem assemblypath -Recurse -Include *.dll |  Copy-Item -Destination "c:\folder to copy to"

nơi đường dẫn lắp ráp có thể sử dụng ký tự đại diện.


0

Một hướng khác - chỉ cần giải nén tệp MSI và nhận các tính năng theo cách đó. Cứu bạn khỏi việc gỡ cài đặt cuối cùng. . .


0

Sao chép từ một dòng lệnh là không cần thiết. Tôi đã gõ tên của DLL từ tìm kiếm Start Window. Tôi đã chọn Xem thêm kết quả. Một trong GAC đã được trả lại trong cửa sổ tìm kiếm. Tôi nhấp chuột phải vào nó và nói vị trí tập tin mở. Nó đã mở trong Windows Explorer bình thường. Tôi đã sao chép tập tin. Tôi đóng cửa sổ. Làm xong.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.