如何从 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 中提取程序集?的主要内容,如果未能解决你的问题,请参考以下文章