如何从 GAC 中提取程序集?

Posted

技术标签:

【中文标题】如何从 GAC 中提取程序集?【英文标题】:How to extract an assembly from the GAC? 【发布时间】:2010-10-17 10:13:54 【问题描述】:

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

如何将 GAC 中的实际程序集(DLL)清除到正常文件系统中?

谢谢。

【问题讨论】:

【参考方案1】:

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

【讨论】:

今天早上我发现了一个有趣的问题。我正在更新 GAC 中的 DLL,并使用 cmd 行方法进行备份。当我尝试上传新的 DLL(相同的版本号)时,我收到了一个错误,只有在我关闭 cmd 窗口时才会消失。花了我几分钟的时间诅咒找出问题所在!【参考方案2】:

我使用来自 this article 的建议从 GAC 获取程序集。

让 DLL 脱离 GAC

DLL 一次 部署在 GAC(通常位于 c:\windows\assembly) 无法查看 或用作普通的 DLL 文件。他们 不能直接从VS引用 项目。开发人员通常会保留一个 原始 DLL 文件的副本和 在项目中参考它 开发(设计)时间,它使用 运行时来自 GAC 的程序集 项目。

在执行期间(运行时),如果 组装被发现签署和 在 GAC 中自动部署 CLR 从 GAC 获取程序集 而不是期间引用的 DLL VS中的设计时间。万一 开发者删除了原来的DLL 或者由于某种原因没有, 有一种方法可以获取 DLL 文件 来自广汽。请按照以下步骤操作 从 GAC 复制 DLL

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

    shfusion.dll 是一个资源管理器扩展 DLL,它提供了一个独特的 查看 GAC 文件夹。注销 此文件将删除程序集 缓存查看器和 GAC 文件夹将 然后像任何普通文件夹一样可见 在资源管理器中。

    打开“%windir%\assembly\GAC_MSIL”。

    浏览到你的 DLL 文件夹到深处找到你的 DLL。

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

    运行“regsvr32 %windir%\Microsoft.NET\Framework\<.net>\shfusion.dll”到 重新注册 shfusion.dll 文件并 恢复原来的独特观点 GAC。

【讨论】:

这可行,但有点复杂。如果你不害怕命令提示符,你可以直接 cd 进入必要的目录并复制 DLL。 只需安装 TotalCommander,启用查看所有隐藏文件的选项,即可获取所需的每个程序集 @Andrew,看起来shfusion.dll 在传递/i 选项时不支持regsvr32 调用的DllInstall() 入口点。省略该选项可以成功重新注册组件。 您可以跳过第 1 步和第 2 步,直接进入 %windir%\assembly\GAC_MSIL 并从那里浏览。 @ChristianFredh 请注意:对我来说,这只能直接从“运行”对话框中完成。【参考方案3】:

是的。

添加 DisableCacheViewer 注册表项

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

回到 Windows 资源管理器的程序集文件夹,这将是正常的文件系统视图。

【讨论】:

被低估的答案。谢谢! 这是真正的解决方案。易于撤消,无需命令行。【参考方案4】:

这里描述的方法很简单:

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

文章摘要:

映射网络驱动器(资源管理器 -> 工具) 映射到 \servername\folder (\\YourServer\C$\Windows\Assembly) 如果您是管理员,则无需共享 浏览到驱动器并解压缩您的程序集

【讨论】:

【参考方案5】:

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

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

希望对您有所帮助。

【讨论】:

【参考方案6】:

这篇MSDN blog 帖子描述了从 GAC 中提取 DLL 的三种不同方法。迄今为止给出的方法的有用总结。

【讨论】:

【参考方案7】:

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

稍等

你有一个存档文件,其中包含 GAC 中的所有程序集

【讨论】:

【参考方案8】:

打开命令提示符并输入:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

这应该给出整个 GAC 的转储

享受吧!

【讨论】:

Deepak 的回答更清晰,并使用了带有适当标志的 xcopy。 在逐步解决问题后,我将这个答案评为 #1,因为它需要 5 秒才能获得所有内容。【参考方案9】:

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

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

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

程序集路径可以使用通配符的地方。

【讨论】:

【参考方案12】:

我是PowerShell GAC 的作者。使用 PowerShell GAC,您可以从 GAC 中提取程序集,而无需依赖 GAC 内部,例如更改文件夹结构。

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

【讨论】:

【参考方案13】:

不需要从命令行复制。我从开始窗口搜索中输入了 DLL 的名称。我选择了查看更多结果。 GAC 中的那个在搜索窗口中返回。我右键单击它并说打开文件位置。它在普通的 Windows 资源管理器中打开。我复制了文件。我关上了窗户。完毕。

【讨论】:

【参考方案14】:

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

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

%windir%\assembly\GAC_MSIL\System

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

我在 windows 7 和 windows server 2012 上对此进行了测试。

注意:创建快捷方式时它不会让您使用该目标,但可以编辑它。

享受吧!

【讨论】:

【参考方案15】:

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

【讨论】:

非常简单的解决方案。谢谢。

以上是关于如何从 GAC 中提取程序集?的主要内容,如果未能解决你的问题,请参考以下文章

确定是不是正在使用 GAC 和 NGen 的程序集

将 DLL 安装到全局程序集缓存(GAC)

(28)部署强命名程序集到GAC

在 GAC 注册的消费程序集

C#:在 GAC 中查找 PresentationCore.dll(和其他程序集)的路径

共享程序集GAC