关于 GAC 目录

来源:互联网 发布:python内存管理机制 编辑:程序博客网 时间:2024/05/23 21:21

0. 什么是 GAC ?

全局程序集缓存 http://msdn.microsoft.com/zh-cn/library/yf1d93sz(VS.80).aspx

1. GAC 在哪里?

C:/Windows/Assembly

2. 这个目录怎么如此Ugly?

GAC01

其实 C:/Windows/Assembly 是一个实实在在的文件目录,鉴于该目录的特殊性,装了.NET之后,默认对该目录启用了一个 Explorer Shell,提供特殊的视图

3. 为什么常有人提到 C:/Windows/assembly/GAC 目录,而我却看不到?

你可以用 dir 命令查看真实结构:

GAC02

或者直接输入 C:/Windows/assembly/GAC

GAC03 

4. 怎么又有这么多子目录?

见 Shiny Zhu 在 http://social.microsoft.com/forums/zh-CN/netframeworkzhchs/thread/281edc5d-bc84-43a4-a409-74bf5992c827/ 所述:

GAC 目录是结构化的,是用一个算法管理子目录的名称,是系统自动管理的,永远不要采用手工方式将程序集复制到 GAC 目录.一个比较完整的.NET Framework 2.0的GAC下子目录的结构如下所示:C:/WINDOWS/Assembly/GACC:/WINDOWS/Assembly/GAC_32C:/WINDOWS/Assembly/GAC_MSILC:/WINDOWS/Assembly/GAC_64C:/WINDOWS/Assembly/NativeImages1_v1.1.4322C:/WINDOWS/Assembly/NativeImages_v2.0.50727_32C:/WINDOWS/Assembly/NativeImages_v2.0.50727_64其中:GAC是用于存放基于.NET Framework 1.0/1.1创建的Assemblies,这些Assemblies只能运行在32-bit 地址空间。GAC_MSIL用于存放基于.NET Framework 2.0上的无特定CPU指定的Assemblies,这些assemblies可以运行在32-bit地址空间或者64-bit地址空间。GAC_32也是用于存放基于.NET Framework 2.0创建的基于x86架构的Assemblies,因为这些Assemblies可以拥有32-bit的native CPU代码,所以只能运行在32-bit空间,可以直接在32-bit系统上运行或者使用WOW64技术在64-bit的OS系统上运行。GAC_64用于存放.NET Framework 2.0上创建的基于x64或者IA64的Assemblies,这些Assemblies可能含有x64或者IA64的Native Code,所以他们只能运行在64-bit地址空间上。这个目录在32-bit的OS上不存在。值得注意的是,GAC_64中的Assemblies是根据系统架构决定,在x64系统上,该目录中的Assemblies就必须是基于x64的,IA64的Assemblies无法被装入,反之亦然。以NativeImages开头的目录存放的通过NGen.exe编译assembly生成的基于当前平台的非managed代码,这个目录不需要Strongly named Assemblies,后面的数字对应了版本号。而基于.NET Framework 2.0的两个NativeImages目录名称最后的两个字符’64’和’ 32’则代表了对应的平台。

5. 上面2中提到的 Shell,到底是什么?

见 MSDN 程序集缓存查看器 (Shfusion.dll) http://msdn.microsoft.com/zh-cn/library/34149zk3(VS.80).aspx

这个 dll 存在于:c:/windows/microsoft.net/framework/v<version>/shfusion.dll

6. 如果我决定抛弃这个 Shell 呢?你知道,我可是.NET高手呢

那就卸载吧:

C:/Users/Administrator>regsvr32 /u c:/windows/microsoft.net/framework/v2.0.50727/shfusion.dll

虽然你是高手,还是老老实实还原吧,是人就会犯错滴:

C:/Users/Administrator>regsvr32 c:/windows/microsoft.net/framework/v2.0.50727/shfusion.dll

GAC04

7. 如果我要从 GAC 偷某些 dll 出来怎么办?

  a. 如上2所述,用 dir 命令进入 dll 的所在目录,注意其 version+publictoken 的子目录,用 copy 命令

  b. 如上6所述,暂时抛弃 shfusion,就可以看到其庐山面目啦

8. 如果我要 Debug GAC 的dll 怎么办?

这个问题的关键是 Debug Symbol!

  部署 dll 同时部署 pdb(注意版本一致),如何部署通过上面 7 就知道了

原创粉丝点击