【问题标题】:How can i get the location of the GAC using C#?如何使用 C# 获取 GAC 的位置?
【发布时间】:2009-10-12 21:50:52
【问题描述】:

如何使用 C# 获取GAC 目录 的位置?

Windows 注册表中是否存在条目?

更新

我需要该位置,因为我想枚举和分析位于 GAC 中的程序集。

再见。

【问题讨论】:

  • 哇,哇哇。等一下!它不是真的文件夹。我认为这只是你想要完成的一小部分;见:stackoverflow.com/questions/205188/…
  • 没有“GAC 目录”之类的东西。 GAC 只是一个程序集列表。
  • 这是一个虚拟文件系统 - 说它不是一个目录似乎过于迂腐。正如您通过dir %windir%\assembly 看到的那样,它确实看起来像是世界其他地方的一组目录!

标签: c# .net gac


【解决方案1】:

如果您想枚举 GAC 中的内容(例如编写系统管理工具),最好的选择是使用 fusion.dll,尽管这需要一些互操作代码。

Link to Microsoft for Fusion.DLL Documentation

【讨论】:

  • 相信我,您不想依赖 GAC 在文件系统中“出现”的位置。它可以改变。
  • 没错。现在 .NET 4.0 Beta 2 已公开,我们看到 MS 已将 GAC 的位置移动到 %SYSTEM%\Microsoft.NET\assembly\GAC* 目录,因此我们知道最好还是使用 Fusion 来查找它。
【解决方案2】:

有绝对正当的理由像文件夹一样手动访问 GAC。当然,人们应该意识到在那里操纵事物的风险。但我会说,只读访问是完全可以的。

除了提到的 %windir%\assembly 之外,Nir Sofer 可能已经为您完成了这项工作。他写了GACView

嘿,它甚至具有禁用资源管理器中的特殊视图的功能:选项/禁用资源管理器中的程序集查看器。然后该文件夹将显示为普通文件夹。虽然这在 Windows XP 上运行良好,但在 Windows 7 64 位上却不行,因为它是在 32 位版本的注册表中设置的。 要在 Windows 7 64 位上禁用程序集查看器,请启动 Regedit(64 位),转到

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion

并添加一个名为 DisableCacheViewer 的新 DWORD,其值为 1。

要独立于目录(可能会改变),您可以通过 Fusion Registry Key 枚举程序集:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\GACChangeNotification\Default

我猜这就是 GACView 在内部的工作方式。但它仍然不会枚举 %windir%\Microsoft.NET\assembly 中的 .NET 4 程序集。

支持 .NET 4 的工具是 GACBrowser,但它显示的信息较少。

【讨论】:

    【解决方案3】:

    它位于 %windir%\Assembly 文件夹中。

    就代码示例而言,Dan 首先得到了答案。

    【讨论】:

    • 那你打算保密吗?
    • 可能是因为如果您正在寻找 GAC 文件夹,那么您做错了什么。 GAC 的“位置”不是固定的,也没有用于查找它的 API。
    • 我完全同意你的观点,如果他需要那个文件夹,可能会有(非常)错误。另一方面,也许他只是想开发一个信息工具。那为什么不呢。事实上,这甚至是有意义的,因为默认情况下该文件夹无法在资源管理器中打开。并且代码示例表明获取路径并不难。
    • 请注意,对于 .NET 4.0 Beta 2,GAC 程序集的位置不再默认为 %windir$\assembly。
    【解决方案4】:

    不总是%windir%\assembly 吗?

    编辑:

    c:\Windows>dir \windows\assembly
     Volume in drive C has no label.
     Volume Serial Number is C8BC-2EBD
    
     Directory of c:\windows\assembly
    
    08/14/2009  03:06 AM    <DIR>          GAC
    07/28/2009  03:07 AM    <DIR>          GAC_32
    09/08/2009  10:57 PM    <DIR>          GAC_MSIL
    08/15/2009  07:35 PM    <DIR>          NativeImages_v2.0.50727_32
    09/08/2009  10:57 PM    <DIR>          temp
    09/08/2009  09:47 PM    <DIR>          tmp
                   0 File(s)              0 bytes
                   6 Dir(s)   4,560,822,272 bytes free
    

    【讨论】:

    • 不,它并不总是%windir%\Assembly。它现在恰好是这样,但它的当前位置和结构不能保证保持不变,也不能保证将文件放在那里一个合理的 API 来安装或从 GAC 读取信息。
    • @Robert 微软不太可能改变它,因为这样做会给向后兼容性带来很大的风险。 (并不是说尝试这样做就可以)
    【解决方案5】:

    让运行时管理它的程序集并相信它们会在那里。如果您需要安装某些东西,请使用 gacutil。如果您需要卸载某些东西,请使用 gacutil。如果您需要访问程序集,请在项目中添加对它的引用。如果您需要在其他人的计算机上与 GAC 进行交互,请按照 @Dan 所说的操作并使用 MSI 和朋友。

    否则不要接触 GAC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      相关资源
      最近更新 更多