GAC'den bir montaj nasıl çıkarılır?


134

Montajları doğrudan GAC'a yükleyen bir paket var (örneğin,% windows% / assembly içinde derin bir yerde).

Gerçek derleme (DLL) GAC normal dosya sistemine nasıl kovmak?

Teşekkürler.

Yanıtlar:


150

Bu makaledeki önerileri GAC'den bir derleme almak için kullandım.

DLL'yi GAC'den Çıkarma

GAC'de (normalde c: \ windows \ assembly konumunda bulunur) dağıtılan DLL dosyaları görüntülenemez veya normal bir DLL dosyası olarak kullanılamaz. VS projesinden doğrudan referans alınamazlar. Geliştiriciler genellikle orijinal DLL dosyasının bir kopyasını saklar ve projenin çalışma zamanında GAC ​​derlemesini kullanan geliştirme (tasarım) zamanında projeye başvururlar.

Montaj (çalışma zamanı) sırasında, derlemenin GAC'de imzalandığı ve dağıtıldığı bulunursa, CLR, VS'de tasarım zamanında başvurulan DLL yerine derlemeyi GAC'den otomatik olarak alır. Geliştiricinin orijinal DLL dosyasını silmiş olması veya herhangi bir nedenle sahip olmaması durumunda, DLL dosyasını GAC'den almanın bir yolu vardır. GAC'den DLL kopyalamak için aşağıdaki adımları izleyin

  1. Regsvr32 / u C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dll dosyasını çalıştırın

    • shfusion.dll, GAC klasörüne farklı bir görünüm veren bir explorer uzantısı DLL'dir. Bu dosyanın kaydının kaldırılması derleme önbellek görüntüleyicisini kaldıracak ve GAC klasörü kaşifte normal bir klasör olarak görünecektir.
  2. “% Windir% \ assembly \ GAC_MSIL” dosyasını açın.

  3. DLL'nizi bulmak için DLL klasörünüze derinlemesine göz atın.

  4. DLL dosyasını sabit diskinizde bir yere kopyalayın ve projenizde oradan yönlendirin

  5. Shfusion.dll dosyasını yeniden kaydetmek ve GAC'ın özgün ayrı görünümünü yeniden kazanmak için "regsvr32% windir% \ Microsoft.NET \ Framework \ <. NET sürüm dizini> \ shfusion.dll" komutunu çalıştırın.


81
Bu işe yarıyor ama biraz karmaşık. Komut isteminden korkmuyorsanız, gerekli dizine cd atabilir ve DLL'i bu şekilde kopyalayabilirsiniz.
Cheeso

3
TotalCommander'ı yükleyin, tüm gizli dosyaları görme seçeneğini etkinleştirin ve istediğiniz her montajı alabilirsiniz
Patrick Peters

4
@Andrew, seçenek geçildiğinde çağrılan giriş noktasını shfusion.dlldesteklemiyor gibi görünüyor . Bu seçeneğin atlanması, bileşenin başarıyla yeniden kaydedilmesini sağlar. DllInstall()regsvr32/i
Frédéric Hamidi

9
1. ve 2. adımları atlayabilir ve doğrudan% windir% \ assembly \ GAC_MSIL adresine gidip oradan göz atabilirsiniz.
Christian Fredh

5
@ChristianFredh Sadece bir not: benim için bu sadece doğrudan Çalıştır iletişim kutusundan yapılabilir.
xr280xr


84

Komut İstemi'ni açın ve şunu yazın:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Bu, tüm GAC'nin dökümünü vermelidir

Zevk almak!


10
Deepak'ın cevabı daha açıktı ve uygun bayraklarla xcopy kullandı.
katbyte

Bu cevabı # 1, adım adım yaklaşımlarla ilgili sorunlara çarptıktan sonra her şeyi almak için 5 saniye sürdüğü için değerlendiririm.
FBryant87

24

Evet.

DisableCacheViewer Kayıt Defteri Anahtarı Ekle

HKLM \ Software \ Microsoft \ Fusion \ altında DisableCacheViewer adıyla yeni bir dword anahtarı oluşturun ve [DWORD] değerini 1 olarak ayarlayın.

Windows Gezgini'ne derleme klasörüne dönün ve normal dosya sistemi görünümü olacaktır.


2
Düşük puanlı cevap. Teşekkürler!
xr280xr

1
Bu gerçek çözüm. Geri alınması kolaydır ve komut satırı gerekmez.
user2920518

16

Sanırım en kolay yol, David'in bahsettiği gibi komut satırından bunu yapmak. Tek hile .dll sadece C: \ Windows \ Assembly yer değil olmasıdır. C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY] adresine gitmelisiniz. Daha sonra aşağıdakileri kullanarak bir kopya yapabilirsiniz:

[ASSEMBLY_NAME] .dll c: \ (veya istediğiniz konumu) kopyalayın

Umarım yardımcı olur.


13

Bulduğum kolay yol, komut istemini açmak ve istediğiniz DLL'yi bulana kadar bahsettiğiniz klasöre göz atmaktır - daha sonra bunu elde etmek için copy komutunu kullanabilirsiniz. Windows Gezgini bu klasörün "yardımcı" özel bir görünümüne sahiptir.


Bu sabah ilginç bir sorun buldum. GAC bir DLL güncelleştirmek ve bir yedekleme almak için cmd line yöntemini kullandı. Yeni DLL'yi (aynı sürüm numarası) yüklemeye çalıştığımda, yalnızca cmd penceresini kapattığımda ortadan kaybolan bir hata aldım. Neyin yanlış gittiğini öğrenmek için birkaç dakika küfretti!
NeilD

11

RUN'u açın ve yazın %windir%\assembly\GAC_MSIL, bu dll'lerinizi klasörlerin görünümünde açacak ve daha sonra dll adlı klasöre gidip açabileceksiniz, dll dosyanızı bulacak ve kolayca kopyalayabileceksiniz


Çok kolay bir çözüm. Teşekkür ederim.
Dblock247

4

Ben yazarı değilim PowerShell GAC . PowerShell GAC ile klasör yapılarını değiştirmek gibi GAC dahili bileşenlerine bağlı kalmadan montajları GAC'den çıkarabilirsiniz.

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

3

Bu MSDN blog yazısı, GAC'den bir DLL çıkarmanın üç ayrı yolunu açıklar. Şu ana kadar verilen yöntemlerin yararlı bir özeti.


3

Bunun yerine "Total Commander" dosya tarayıcısını kullanın.

  1. Total Commander'da "gizli / sistem dosyalarını göster" ayarını etkinleştirin
  2. "C: \ windows \ assembly" ye göz atın
  3. kopya

3

Kayıt defterini değiştirmeden veya komut satırını, powershell'i veya diğer programları kullanmadan GAC'ın içine bakmanın bir yolunu bulduğumu düşünün:

Yeni bir kısayol oluşturun (herhangi bir yere). Ardından, hedefin olması için kısayolu değiştirin:

%windir%\assembly\GAC_MSIL\System

Bu kısayolu açmak sizi GAC içindeki (herkesin sahip olması gereken) Sistem klasörüne götürür ve daha yüksek bir dizine geçmenizi ve ardından istediğiniz herhangi bir klasöre göz atmanızı (ve dll dosyalarına vb.

Bunu Windows 7 ve Windows Server 2012'de test ettim.

Not: Kısayolu oluştururken bu hedefi kullanmanıza izin vermez, ancak düzenlemenize izin verir.

Zevk almak!


2

sadece C: \ Windows dizinine gidin ve [assembly] klasörünü sağ tıklayın ve arşive ekle'yi seçin

biraz bekle

vola, GAC'nizdeki tüm montajları içeren bir arşiv dosyanız var


2

Bir Powershell betiğinden bunu deneyebilirsiniz. GAC'de montajın sadece tek bir versiyonu vardı, bu yüzden bu iyi çalıştı.

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

burada montaj yolu joker karakterler kullanabilir.


0

Başka bir yön - sadece MSI dosyasını açın ve hediyeler bu şekilde olsun. Sizi nihai kaldırma işleminden kurtarır. . .


0

Bir komut satırından kopyalama gerekli değildir. Başlangıç ​​Penceresi aramasından DLL adını yazdım. Daha Fazla Sonuç Görmeyi seçtim. GAC'deki arama penceresine döndürüldü. Üzerine sağ tıkladım ve açık dosya konumu söyledim. Normal Windows Gezgini'nde açıldı. Dosyayı kopyaladım. Pencereyi kapattım. Bitti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.