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

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

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

谢谢。

【问题讨论】:

    标签: .net assemblies


    【解决方案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

    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。

    【讨论】:

    • 这可行,但有点复杂。如果你不害怕命令提示符,你可以直接 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”。

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

              【讨论】:

                【解决方案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文件并轻松复制它

                        【讨论】:

                        • 非常简单的解决方案。谢谢。
                        猜你喜欢
                        • 2010-12-14
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-07-25
                        • 1970-01-01
                        相关资源
                        最近更新 更多