如何从GAC中提取程序集?

有一个我必须处理的包直接进入GAC的组件(例如,%windows%/ assembly的深处)。

如何从GAC驱动实际的程序集(DLL)到正常的文件系统?

谢谢。

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

从GAC获取DLL

曾经部署在GAC中的DLL(通常位于c:\ windows \ assembly)不能被看作是一个普通的DLL文件。 他们不能直接引用VS项目。 开发人员通常保留原始DLL文件的副本,并在开发(devise)时间的项目中引用该项目,该项目在运行时使用来自GAC的程序集。

在执行期间(运行时),如果程序集被发现在GAC中签名和部署,CLR将自动从GAC中拿起程序集,而不是在VS中的devise时引用该程序集。 如果开发人员删除了原始的DLL或没有出于某种原因,有一种方法可以从GAC获取DLL文件。 按照以下步骤从GAC复制DLL

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

    • shfusion.dll是一个浏览器扩展DLL,它给了GAC文件夹一个独特的外观。 取消注册此文件将删除程序集caching查看器,然后GAC文件夹将作为资源pipe理器中的任何常规文件夹可见。
  2. 打开“%windir%\ assembly \ GAC_MSIL”。

  3. 浏览到您的DLL文件夹深入find您的DLL。

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

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

这里描述的方法非常简单:

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

文章摘要:

  • 映射networking驱动器(资源pipe理器 – >工具)
    • 映射到\ servername \文件夹( \\YourServer\C$\Windows\Assembly
  • 如果您是pipe理员,则无需共享
  • 浏览到驱动器并提取您的组件

打开命令提示符并键入:

 cd c:\windows\assembly\GAC_MSIL xcopy . C:\GacDump /s /y 

这应该给整个GAC的转储

请享用!

是。

添加DisableCacheViewerregistry项

使用名称DisableCacheViewer在HKLM \ Software \ Microsoft \ Fusion \下创build一个新的DWORD键,并将其[DWORD]值设置为1。

回到Windows资源pipe理器的程序集文件夹,它将是普通的文件系统视图。

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

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

希望有所帮助。

我find的简单方法是打开命令提示符并浏览您提到的文件夹,直到find所需的DLL – 然后可以使用复制命令将其解开。 Windows资源pipe理器具有该文件夹的“有用的”特殊视图。

我是PowerShell GAC的作者。 借助PowerShell GAC,您可以从GAC中提取程序集,而不依赖于GAC内部结构,如更改文件夹结构。

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

这篇MSDN博客文章描述了从GAC中提取DLL的三种独立方式。 迄今给出的方法的一个有用的总结。

改用文件浏览器“Total Commander”。

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

从Powershell脚本,你可以试试这个。 我在GAC中只有一个版本的程序集,所以这工作得很好。

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

assemblypath可以使用通配符。

只需导航到C:\ Windowsfind[程序集]文件夹右键单击并select添加到存档

等一下

您有一个包含GAC中所有程序集的归档文件

想想我想出了一种在GAC内部查看的方式,无需修改registry或使用命令行,PowerShell或其他程序:

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

 %windir%\assembly\GAC_MSIL\System 

打开这个快捷方式会把你带到GAC里面的系统文件夹(每个人都应该拥有这个文件夹),并且有一个奇妙的副作用,让你切换到更高的目录,然后浏览到你想要的任何其他文件夹(并查看dll文件等)

我在Windows 7和Windows Server 2012上testing了这个。

注意:创build快捷方式时,不会让您使用该目标,但可以让您对其进行编辑。

请享用!

打开运行,然后input%windir%\assembly\GAC_MSIL ,这将打开你的dll文件夹的视图,然后导航到你的dll命名文件夹并打开它,你会发现你的dll文件,并轻松地复制

另一个方向 – 只需解压缩MSI文件,并获得这些好东西。 从最终卸载保存您。 。 。

从命令行复制是不必要的。 我从“开始窗口”search中键入了DLL的名称。 我select了查看更多结果。 GAC中的那个在search窗口中返回。 我右键点击它,并说打开文件的位置。 它在正常Windows资源pipe理器中打开。 我复制了文件。 我关上了窗户。 完成。