如何从GAC中提取装配体?


134

我必须处理一个程序包,它将程序集直接安装到GAC中(例如,%windows%/ assembly中的某个深处)。

如何将GAC中的实际程序集(DLL)驱除到普通文件系统中?

谢谢。

Answers:


150

我使用了本文的建议,以从GAC获得一个程序集。

从GAC中获取DLL

一旦在GAC中部署了DLL(通常位于c:\ windows \ assembly),就无法将其视为常规DLL文件或将其用作常规DLL文件。不能从VS项目中直接引用它们。开发人员通常会保留原始DLL文件的副本,并在开发(设计)时在项目中引用它,该文件在项目运行时使用GAC的程序集。

在执行过程中(运行时),如果发现该程序集已在GAC中签名并部署,则CLR会自动从GAC中拾取该程序集,而不是在VS中的设计时从中提取DLL。如果开发人员已删除原始DLL或由于某种原因而没有原始DLL,则有一种方法可以从GAC获取DLL文件。请按照以下步骤从GAC复制DLL

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

    • shfusion.dll是一个资源管理器扩展DLL,它使GAC文件夹具有独特的外观。取消注册该文件将删除程序集缓存查看器,然后GAC文件夹将在资源管理器中显示为任何普通文件夹。
  2. 打开“%windir%\ assembly \ GAC_MSIL”。

  3. 浏览到您的DLL文件夹,深入查找DLL。

  4. 将DLL复制到硬盘上的某个位置,然后在项目中从那里引用它

  5. 运行“ regsvr32%windir%\ Microsoft.NET \ Framework \ <。NET版本目录> \ shfusion.dll”以重新注册shfusion.dll文件并重新获得GAC的原始视图。


81
这可行,但有点复杂。如果您不害怕命令提示符,则只需将cd放入必要的目录,然后以这种方式复制DLL。
Cheeso

3
只需安装TotalCommander,启用该选项即可查看所有隐藏文件,即可获取所需的每个程序集
Patrick Peters

4
@Andrew,shfusion.dll似乎不支持通过选项时DllInstall()调用的入口点。省略该选项可以成功重新注册组件。regsvr32/i
弗雷德里克·哈米迪

9
您可以跳过步骤1和2,并直接转到%windir%\ assembly \ GAC_MSIL并从那里浏览。
克里斯蒂安·弗雷德

5
@ChristianFredh请注意:对我来说,这只能直接在“运行”对话框中完成。
xr280xr 2013年


84

打开命令提示符并键入:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

这应该使整个GAC都转储

请享用!


10
Deepak的答案更清楚,并使用带有适当标志的xcopy。
katbyte

我将这个答案评为#1,因为在逐步解决方法上遇到问题后,花了5秒钟才得到了一切。
FBryant87 '17

24

是。

添加DisableCacheViewer注册表项

在名称为DisableCacheViewer的HKLM \ Software \ Microsoft \ Fusion \下创建一个新的dword密钥,并将其[DWORD]值设置为1。

返回Windows资源管理器并转到Assembly文件夹,它将是普通文件系统视图。


2
被低估的答案。谢谢!
xr280xr 2013年

1
这是真正的解决方案。易于撤消,无需命令行。
user2920518 '17

16

我认为最简单的方法是像David提到的那样通过命令行来完成。唯一的技巧是.dll不仅位于C:\ Windows \ Assembly。您必须导航到C:\ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]。然后,您可以使用以下方法进行复制:

复制[ASSEMBLY_NAME] .dll c:\(或您想要的任何位置)

希望有帮助。


13

我发现的简单方法是打开命令提示符并浏览您提到的文件夹,直到找到所需的DLL-然后可以使用copy命令将其取出。Windows资源管理器对此文件夹具有“有用的”特殊视图。


今天早上我发现了一个有趣的问题。我正在GAC中更新DLL,并使用cmd line方法进行备份。当我尝试上载新的DLL(相同的版本号)时,收到一个错误,该错误仅在我关闭cmd窗口时消失了。花了我几分钟的诅咒来找出问题所在!
NeilD 2010年

11

打开RUN然后键入%windir%\assembly\GAC_MSIL,这将在文件夹视图中打开您的dll,然后您可以导航到名为dll的文件夹并打开它,您将找到dll文件并轻松复制


非常简单的解决方案。谢谢。
Dblock247 '18



3

而是使用文件浏览器“ Total Commander”。

  1. 在Total Commander中启用“显示隐藏/系统文件”设置
  2. 浏览到“ c:\ windows \ assembly”
  3. 复制

3

想想我想出了一种无需修改注册表或使用命令行,powershell或任何其他程序即可查看GAC的方法:

创建一个新的快捷方式(到任何地方)。然后修改快捷方式以使目标为:

%windir%\assembly\GAC_MSIL\System

打开此快捷方式会将您带到GAC内的System文件夹(每个人都应该拥有),它的副作用是,您可以切换到更高的目录,然后浏览到所需的任何其他文件夹(并查看dll文件等)。

我在Windows 7和Windows Server 2012上对此进行了测试。

注意:创建快捷方式时,它不会让您使用该目标,但会允许您对其进行编辑。

请享用!


2

只需导航到C:\ Windows,右键单击[assembly]文件夹并选择Add to archive

等一下

您有一个存档文件,其中包含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

另一个方向-只需解压缩MSI文件并以这种方式获得好东西。使您免于最终的卸载。。。


0

从命令行复制是不必要的。我从“开始窗口”搜索中键入了DLL的名称。我选择了“查看更多结果”。GAC中的一个已在搜索窗口中返回。我右键单击它并说打开文件位置。它在正常的Windows资源管理器中打开。我复制了文件。我关上窗户了。做完了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.