จะแยกชุดประกอบออกจาก GAC ได้อย่างไร?


134

มีแพ็คเกจที่ฉันต้องจัดการซึ่งติดตั้งแอสเซมบลีตรงเข้าไปใน GAC (เช่นที่ไหนสักแห่งที่ลึกเป็น% windows% / แอสเซมบลี)

ฉันจะขับไล่แอสเซมบลีจริง (DLL) จาก GAC เข้าสู่ระบบไฟล์ปกติได้อย่างไร

ขอบคุณ.

คำตอบ:


150

ฉันใช้คำแนะนำจากบทความนี้เพื่อรับชุดประกอบจาก GAC

นำ DLL ออกจาก GAC

เมื่อใช้งาน DLL ใน GAC แล้ว (โดยปกติจะอยู่ที่ c: \ windows \ assembly) จะไม่สามารถดูหรือใช้เป็นไฟล์ DLL ปกติได้ ไม่สามารถอ้างอิงโดยตรงจากโครงการ VS นักพัฒนามักจะเก็บสำเนาของไฟล์ DLL ดั้งเดิมไว้และอ้างถึงในโปรเจ็กต์ตามเวลาพัฒนา (ออกแบบ) ซึ่งใช้แอสเซมบลีจาก GAC ระหว่างรันไทม์ของโปรเจ็กต์

ในระหว่างการดำเนินการ (รันไทม์) หากพบว่าแอสเซมบลีถูกลงนามและปรับใช้ใน GAC CLR จะรับแอสเซมบลีจาก GAC โดยอัตโนมัติแทนที่จะเป็น DLL ที่อ้างถึงระหว่างเวลาออกแบบใน VS ในกรณีที่นักพัฒนาลบ DLL เดิมหรือไม่มีด้วยเหตุผลบางประการมีวิธีรับไฟล์ DLL จาก GAC ทำตามขั้นตอนต่อไปนี้เพื่อคัดลอก DLL จาก GAC

  1. เรียกใช้ regsvr32 / u C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dll

    • shfusion.dll เป็น DLL ส่วนขยาย explorer ที่ให้รูปลักษณ์ที่แตกต่างไปจากโฟลเดอร์ GAC การยกเลิกการลงทะเบียนไฟล์นี้จะลบแอสเซมบลีแคชวิวเวอร์และโฟลเดอร์ GAC จะมองเห็นได้เหมือนโฟลเดอร์ปกติใน explorer
  2. เปิด“% windir% \ assembly \ GAC_MSIL”

  3. เรียกดูโฟลเดอร์ DLL ของคุณในส่วนลึกเพื่อค้นหา DLL ของคุณ

  4. คัดลอก DLL ที่ใดที่หนึ่งบนฮาร์ดดิสก์ของคุณและอ้างอิงจากที่นั่นในโครงการของคุณ

  5. เรียกใช้ "regsvr32% windir% \ Microsoft.NET \ Framework \ <. NET version directory> \ shfusion.dll" เพื่อลงทะเบียนไฟล์ shfusion.dll อีกครั้งและรับมุมมองที่แตกต่างเดิมของ GAC


81
ใช้งานได้ แต่มีความซับซ้อนเล็กน้อย หากคุณไม่กลัวพรอมต์คำสั่งคุณสามารถ cd ลงในไดเร็กทอรีที่จำเป็นและคัดลอก DLL ด้วยวิธีนั้น
Cheeso

3
เพียงแค่ติดตั้ง TotalCommander เปิดใช้งานตัวเลือกเพื่อดูไฟล์ที่ซ่อนอยู่ทั้งหมดและคุณสามารถคว้าทุกชุดประกอบที่คุณต้องการ
Patrick Peters

4
@ แอนดรูดูเหมือนว่าshfusion.dllจะไม่รองรับDllInstall()จุดเริ่มต้นที่เรียกใช้regsvr32เมื่อผ่าน/iตัวเลือก การละเว้นตัวเลือกดังกล่าวจะทำให้สามารถลงทะเบียนส่วนประกอบใหม่ได้สำเร็จ
Frédéric Hamidi

9
คุณสามารถข้ามขั้นตอนที่ 1 และ 2 และไปที่% windir% \ assembly \ GAC_MSIL ได้โดยตรงและเรียกดูจากที่นั่น
Christian Fredh

5
@ChristianFredh หมายเหตุ: สำหรับฉันสิ่งนี้สามารถทำได้โดยตรงจากกล่องโต้ตอบ Run เท่านั้น
xr280xr

108

วิธีการที่อธิบายไว้ที่นี่นั้นง่ายมาก:

http://andreasglaser.net/post/2008/08/05/Extract-assembly-from-Global-Assembly-Cache-(GAC)-with-network-drive-mapping.aspx

สรุปจากบทความ:

  • แมปไดรฟ์เครือข่าย (Explorer -> เครื่องมือ)
    • แมปไปที่ \ servername \ โฟลเดอร์ ( \\YourServer\C$\Windows\Assembly)
  • ไม่จำเป็นต้องแชร์หากคุณเป็นผู้ดูแลระบบ
  • เรียกดูไดรฟ์และแยกชุดประกอบของคุณ

85

เปิดพร้อมรับคำสั่งและพิมพ์:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

สิ่งนี้ควรให้การถ่ายโอนข้อมูลของ GAC ทั้งหมด

สนุก!


10
คำตอบของ Deepak ชัดเจนกว่าและใช้ xcopy กับแฟล็กที่เหมาะสม
katbyte

ฉันจะให้คะแนนคำตอบนี้ # 1 เนื่องจากใช้เวลา 5 วินาทีในการรับทุกอย่างหลังจากตีปัญหาเกี่ยวกับวิธีการทีละขั้นตอน
FBryant87

24

ใช่.

เพิ่มคีย์รีจิสทรี DisableCacheViewer

สร้างคีย์ dword ใหม่ภายใต้ HKLM \ Software \ Microsoft \ Fusion \ ด้วยชื่อ DisableCacheViewer และตั้งค่าเป็น [DWORD] เป็น 1

กลับไปที่ Windows Explorer ไปที่โฟลเดอร์แอสเซมบลีและจะเป็นมุมมองระบบไฟล์ปกติ


2
คำตอบต่ำกว่าคะแนน ขอบคุณ!
xr280xr

1
นี่คือทางออกที่แท้จริง ง่ายต่อการเลิกทำและไม่จำเป็นต้องใช้บรรทัดคำสั่ง
user2920518

16

ฉันคิดว่าวิธีที่ง่ายที่สุดคือทำผ่านบรรทัดคำสั่งเหมือนที่เดวิดกล่าวถึง เคล็ดลับเดียวคือ. dll ไม่ได้อยู่ที่ C: \ Windows \ Assembly คุณต้องไปที่ C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY] จากนั้นคุณสามารถทำสำเนาโดยใช้:

คัดลอก [ASSEMBLY_NAME] .dll c: \ (หรือตำแหน่งใดก็ได้ที่คุณต้องการ)

หวังว่าจะช่วยได้


13

วิธีง่ายๆที่ฉันพบคือเปิดพรอมต์คำสั่งและเรียกดูโฟลเดอร์ที่คุณพูดถึงจนกว่าคุณจะพบ DLL ที่คุณต้องการจากนั้นคุณสามารถใช้คำสั่งคัดลอกเพื่อเอาออกได้ Windows Explorer มีมุมมองพิเศษ "เป็นประโยชน์" ของโฟลเดอร์นี้


ฉันพบประเด็นที่น่าสนใจเมื่อเช้านี้ ฉันกำลังอัปเดต DLL ใน GAC และใช้วิธีบรรทัด cmd เพื่อสำรองข้อมูล เมื่อฉันพยายามอัปโหลด DLL ใหม่ (หมายเลขเวอร์ชันเดียวกัน) ฉันได้รับข้อผิดพลาดซึ่งจะหายไปเมื่อฉันปิดหน้าต่าง cmd เท่านั้น เอาคำด่าฉันสักสองสามนาทีเพื่อหาว่าเกิดอะไรขึ้น!
NeilD

11

เปิดRUNจากนั้นพิมพ์%windir%\assembly\GAC_MSILสิ่งนี้จะเปิด dlls ของคุณในมุมมองโฟลเดอร์จากนั้นคุณสามารถไปที่โฟลเดอร์ชื่อ dll ของคุณและเปิดขึ้นคุณจะพบไฟล์ dll ของคุณและคัดลอกได้อย่างง่ายดาย


วิธีแก้ปัญหาที่ง่ายมาก ขอบคุณ.
Dblock247

4

ผมผู้เขียนของPowerShell GAC ด้วย PowerShell GAC คุณสามารถแยกแอสเซมบลีจาก GAC ได้โดยไม่ต้องขึ้นอยู่กับ GAC ภายในเช่นการเปลี่ยนโครงสร้างโฟลเดอร์

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


3

ใช้ไฟล์เบราว์เซอร์ "Total Commander" แทน

  1. เปิดใช้งานการตั้งค่า "show hidden / system files" ใน Total Commander
  2. เรียกดู "c: \ windows \ assembly"
  3. สำเนา

3

คิดว่าฉันหาวิธีดูภายใน GAC โดยไม่ต้องแก้ไขรีจิสทรีหรือใช้บรรทัดคำสั่ง powershell หรือโปรแกรมอื่น ๆ :

สร้างทางลัดใหม่ (ไปที่ใดก็ได้) จากนั้นแก้ไขทางลัดเพื่อให้เป้าหมายเป็น:

%windir%\assembly\GAC_MSIL\System

การเปิดทางลัดนี้จะนำคุณไปยังโฟลเดอร์ System ภายใน GAC (ซึ่งทุกคนควรมี) และมีผลข้างเคียงที่ยอดเยี่ยมในการให้คุณเปลี่ยนไปใช้ไดเรกทอรีที่สูงขึ้นจากนั้นเรียกดูโฟลเดอร์อื่นที่คุณต้องการ (และดูไฟล์ dll ฯลฯ )

ฉันทดสอบสิ่งนี้บน windows 7 และ windows server 2012

หมายเหตุ: จะไม่อนุญาตให้คุณใช้เป้าหมายนั้นเมื่อสร้างทางลัด แต่จะให้คุณแก้ไขได้

สนุก!


2

เพียงไปที่ C: \ Windows ค้นหาโฟลเดอร์ [แอสเซมบลี] คลิกขวาแล้วเลือกเพิ่มลงในไฟล์เก็บถาวร

รอสักครู่

vola คุณมีไฟล์เก็บถาวรที่มีส่วนประกอบทั้งหมดใน GAC ของคุณ


2

จากสคริปต์ Powershell คุณสามารถลองสิ่งนี้ได้ ฉันมีชุดประกอบเพียงรุ่นเดียวใน GAC ดังนั้นจึงใช้งานได้ดี

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

โดยที่พา ธ การประกอบสามารถใช้สัญลักษณ์แทนได้



0

ไม่จำเป็นต้องคัดลอกจากบรรทัดคำสั่ง ฉันพิมพ์ชื่อ DLL จากการค้นหา Start Window ฉันเลือกดูผลลัพธ์เพิ่มเติม หนึ่งใน GAC ถูกส่งคืนในหน้าต่างค้นหา ฉันคลิกขวาแล้วพูดว่าเปิดตำแหน่งไฟล์ เปิดใน Windows Explorer ปกติ ฉันคัดลอกไฟล์ ฉันปิดหน้าต่าง เสร็จแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.