Bagaimana cara mengekstrak perakitan dari GAC?

134

Ada paket yang harus saya tangani yang menginstal rakitan langsung ke GAC (misalnya di suatu tempat jauh di% windows% / assembly).

Bagaimana cara mengeluarkan rakitan aktual (DLL) dari GAC ke sistem file normal?

Terima kasih.

AngryHacker
sumber

Jawaban:

150

Saya menggunakan saran dari artikel ini untuk mendapatkan perakitan dari GAC.

Dapatkan DLL Keluar dari GAC

DLL setelah diterapkan di GAC (biasanya terletak di c: \ windows \ assembly) tidak dapat dilihat atau digunakan sebagai file DLL normal. Mereka tidak dapat dirujuk langsung dari proyek VS. Pengembang biasanya menyimpan salinan file DLL asli dan merujuknya dalam proyek pada waktu pengembangan (desain), yang menggunakan rakitan dari GAC selama waktu proyek berjalan.

Selama eksekusi (run-time) jika perakitan ditemukan ditandatangani dan disebarkan di GAC, CLR secara otomatis mengambil perakitan dari GAC alih-alih DLL yang direferensikan selama waktu desain di VS. Jika pengembang telah menghapus DLL asli atau tidak memilikinya karena alasan tertentu, ada cara untuk mendapatkan file DLL dari GAC. Ikuti langkah-langkah berikut untuk menyalin DLL dari GAC

  1. Jalankan regsvr32 / u C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dll

    • shfusion.dll adalah DLL ekstensi explorer yang memberikan tampilan berbeda ke folder GAC. Membatalkan pendaftaran file ini akan menghapus penampil cache assembly dan folder GAC kemudian akan terlihat sebagai folder normal di explorer.
  2. Buka “% windir% \ assembly \ GAC_MSIL”.

  3. Jelajahi folder DLL Anda ke dalam untuk menemukan DLL Anda.

  4. Salin DLL di suatu tempat di hard disk Anda dan rujuk dari sana di proyek Anda

  5. Jalankan "regsvr32% windir% \ Microsoft.NET \ Framework \ <. Direktori versi NET> \ shfusion.dll" untuk mendaftarkan ulang file shfusion.dll dan mendapatkan kembali tampilan berbeda asli dari GAC.

Andrew Hare
sumber
81
Ini berfungsi tetapi sedikit rumit. Jika Anda tidak takut dengan prompt perintah, Anda dapat melakukan cd ke direktori yang diperlukan dan menyalin DLL dengan cara itu.
Cheeso
3
Cukup instal TotalCommander, aktifkan opsi untuk melihat semua file tersembunyi dan Anda dapat mengambil setiap perakitan yang Anda inginkan
Patrick Peters
4
@Andrew, sepertinya shfusion.dlltidak mendukung DllInstall()titik masuk yang dipanggil regsvr32ketika melewati /iopsi. Menghilangkan opsi itu memungkinkan untuk mendaftarkan ulang komponen dengan sukses.
Frédéric Hamidi
9
Anda dapat melewati langkah 1 dan 2, dan langsung menuju ke% windir% \ assembly \ GAC_MSIL dan menjelajahinya dari sana.
Christian Fredh
5
@ChristianFredh Sekadar catatan: bagi saya, ini hanya bisa dilakukan langsung dari dialog Run.
xr280xr
85

Buka Command Prompt dan Ketik:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Ini harus memberikan dump dari seluruh GAC

Nikmati!

Deepak
sumber
10
Jawaban Deepak lebih jelas & menggunakan xcopy dengan bendera yang sesuai.
katbyte
Saya akan menilai jawaban ini # 1 karena butuh 5 detik untuk mendapatkan semuanya, setelah membahas masalah pada pendekatan langkah demi langkah.
FBryant87
24

Iya.

Tambahkan Kunci Registri DisableCacheViewer

Buat kunci dword baru di bawah HKLM \ Software \ Microsoft \ Fusion \ dengan nama DisableCacheViewer dan setel nilai [DWORD] ke 1.

Kembali ke Windows Explorer ke folder perakitan dan itu akan menjadi tampilan sistem file normal.

mccrager
sumber
2
Jawaban di bawah nilai. Terima kasih!
xr280xr
1
Inilah solusi sebenarnya. Mudah diurungkan, dan tidak perlu baris perintah.
pengguna2920518
16

Menurut saya cara termudah adalah melakukannya melalui baris perintah seperti yang disebutkan David. Trik satu-satunya adalah bahwa .dll tidak hanya terletak di C: \ Windows \ Assembly. Anda harus menavigasi ke C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]. Anda kemudian dapat melakukan penyalinan menggunakan:

salin [ASSEMBLY_NAME] .dll c: \ (atau lokasi mana pun yang Anda inginkan)

Semoga membantu.

AdamB
sumber
13

Cara mudah yang saya temukan adalah dengan membuka command prompt dan menelusuri folder yang Anda sebutkan sampai Anda menemukan DLL yang Anda inginkan - Anda kemudian dapat menggunakan perintah salin untuk mengeluarkannya. Windows Explorer memiliki tampilan khusus yang "membantu" dari folder ini.

David M
sumber
Saya menemukan masalah menarik pagi ini. Saya memperbarui DLL di GAC, dan menggunakan metode garis cmd untuk membuat cadangan. Ketika saya mencoba mengunggah DLL baru (nomor versi yang sama), saya menerima kesalahan yang hanya hilang ketika saya menutup jendela cmd. Butuh beberapa menit untuk mengumpat untuk mencari tahu apa yang salah!
NeilD
11

Buka RUN lalu ketik %windir%\assembly\GAC_MSIL, ini akan membuka dll Anda di tampilan folder Anda kemudian dapat menavigasi ke folder bernama dll Anda dan membukanya, Anda akan menemukan file dll Anda dan menyalinnya dengan mudah

Hazem Abdelwahab
sumber
Solusi yang sangat mudah. Terima kasih.
Dblock247
4

Saya adalah penulis PowerShell GAC . Dengan PowerShell GAC Anda dapat mengekstrak rakitan dari GAC tanpa bergantung pada internal GAC seperti mengubah struktur folder.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany
Lars Truijens
sumber
3

Posting blog MSDN ini menjelaskan tiga cara terpisah untuk mengekstrak DLL dari GAC. Ringkasan berguna dari metode yang diberikan sejauh ini.

MagicAndi
sumber
3

Gunakan browser file "Total Commander" sebagai gantinya.

  1. Aktifkan pengaturan "tampilkan file tersembunyi / sistem" di Total Commander
  2. Jelajahi ke "c: \ windows \ assembly"
  3. salinan
Max
sumber
3

Saya pikir saya menemukan cara untuk melihat ke dalam GAC tanpa memodifikasi registri atau menggunakan baris perintah, PowerShell, atau program lain:

Buat pintasan baru (ke mana saja). Kemudian ubah pintasan agar memiliki target menjadi:

%windir%\assembly\GAC_MSIL\System

Membuka pintasan ini membawa Anda ke folder Sistem di dalam GAC (yang seharusnya dimiliki semua orang) dan memiliki efek samping yang luar biasa yaitu membiarkan Anda beralih ke direktori yang lebih tinggi dan kemudian menjelajah ke folder lain yang Anda inginkan (dan melihat file dll, dll)

Saya menguji ini di windows 7 dan windows server 2012.

Catatan: Ini tidak akan membiarkan Anda menggunakan target itu saat membuat pintasan tetapi akan membiarkan Anda mengeditnya.

Nikmati!

Bolo
sumber
2

cukup arahkan ke C: \ Windows temukan folder [assembly] klik kanan dan pilih tambahkan ke arsip

Tunggu sebentar

vola Anda memiliki file arsip yang berisi semua majelis di GAC Anda

tsadigov
sumber
2

Dari skrip Powershell, Anda dapat mencoba ini. Saya hanya memiliki satu versi perakitan di GAC jadi ini bekerja dengan baik.

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

di mana jalur perakitan dapat menggunakan karakter pengganti.

Phil Kermeen
sumber
0

Satu arah lain - cukup buka file MSI dan dapatkan barang dengan cara itu. Menyelamatkan Anda dari pencopotan pemasangan. . .

Wyatt Barnett
sumber
0

Menyalin dari baris perintah tidak diperlukan. Saya mengetik nama DLL dari pencarian Start Window. Saya memilih See More Results. Yang ada di GAC dikembalikan di jendela pencarian. Saya mengklik kanan padanya dan berkata buka lokasi file. Itu dibuka di Windows Explorer normal. Saya menyalin file. Saya menutup jendela. Selesai.

Scott Shaw-Smith
sumber