公共语言运行库中的程序集-03全局程序集缓存

全局程序集缓存

安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的代码缓存(计算机范围内的)。全局程序集缓存中存储了指定给计算机中若干应用程序共享的程序集。

仅在需要时将程序集安装到全局程序集缓存中共享。一般地,除非明确要求共享程序集,程序集依赖项保持专用,并在应用程序目录中定位程序集。

另外,不必为了使 COM 互操作或非托管代码能访问程序集,而将程序集安装到全局程序集缓存。

说明:在有些情况下,您显然不希望将程序集安装到全局程序集缓存中。如果您将应用程序的某个程序集置于全局程序集缓存中,则将不再能使用 xcopy 命令复制应用程序目录来复制或安装该应用程序,必须在全局程序集缓存中移动该程序集。

将程序集部署到全局程序集缓存中的方法如下:

  1. 使用专门的全局程序集缓存安装程序。该方法是将程序集安装到全局程序集缓存的首选方法。
  2. 使用 Windows SDK 提供的全局程序集缓存工具 (Gacutil.exe)
  3. 使用 Windows 资源管理器将程序集拖到缓存中。

说明:在部署中,应该使用 Windows Installer 2.0 将程序集安装到全局程序集缓存中。一般地,只在开发中使用 Windows 资源管理器或全局程序集缓存工具,因为它们不提供 Windows Installer 程序集引用计数功能等。

管理员通常使用访问控制列表 (ACL) 来保护 systemroot 目录,以控制写入和执行访问。因为全局程序集缓存安装在 systemroot 目录的子目录中,它继承了该目录的 ACL。建议只允许具有“管理员”权限的用户从全局程序集缓存中删除文件。

在全局程序集缓存中部署的程序集必须具有强名称。将一个程序集添加到全局程序集缓存时,必须对构成该程序集的所有文件执行完整性检查。缓存执行这些完整性检查以确保程序集未被篡改(例如,文件已更改,但清单未反映此更改时)。

 

全局程序集缓存工具 (Gacutil.exe)

全局程序集缓存工具可以查看和操作全局程序集缓存和下载缓存的内容。

gacutil [options] [assemblyName | assemblyPath | assemblyListFile]

参数

使用“/?”或“/h”,显示该工具的命令语法和选项。即:

Gacutil /?

Gacutil /h

备注

全局程序集缓存工具提供与 Windows 外壳程序扩展 (Shfusion.dll) 大致相同的缓存查看功能,但它更适于生成脚本、生成文件和批处理文件。

说明:必须具有管理员特权才能使用 Gacutil.exe

具体说来,Gacutil.exe 可以将程序集安装到缓存中、从缓存中移除程序集以及列出缓存的内容。

Gacutil.exe 提供支持引用计数的选项,类似于 Windows Installer 所支持的引用计数方案。您可以使用 Gacutil.exe 安装两个使用同一程序集的应用程序;全局程序集缓存工具跟踪对该程序集的引用数。结果是,该程序集将一直保留在计算机上,直到卸载这两个应用程序为止。如果将 Gacutil.exe 用于实际产品安装,请使用支持引用计数的选项。同时使用 /i /r 选项可以安装程序集并添加引用对其进行计数。同时使用 /u /r 选项可以移除对程序集的引用计数。注意,单独使用 /i /u 选项不支持引用计数。这些选项在开发期间适用,但不适用于实际的产品安装。

使用 /il /ul 选项可以安装或卸载存储在 ANSI 文本文件中的程序集。该文本文件中的内容必须具有正确的格式。若要使用文本文件安装程序集,请在文件中的单独一行上分别指定每个程序集的路径。下面的示例说明了包含要安装的程序集的文件的内容。

myAssembly1.dll

myAssembly2.dll

myAssembly3.dll

若要使用文本文件卸载程序集,请在文件中的单独一行上分别为每个程序集指定完全限定的程序集名称。下面的示例说明了包含要卸载的程序集的文件的内容。

myAssembly1,Version=1.1.0.0,Culture=en,PublicKeyToken=874e23ab874e23ab

myAssembly2,Version=1.1.0.0,Culture=en,PublicKeyToken=874e23ab874e23ab

myAssembly3,Version=1.1.0.0,Culture=en,PublicKeyToken=874e23ab874e23ab

示例

下面命令将程序集 mydll.dll 安装到全局程序集缓存中:

gacutil /i mydll.dll

下面命令从全局程序集缓存中移除程序集 hello(只要不存在对该程序集的引用计数):

gacutil /u hello

请注意,上面的命令可能会从程序集缓存中移除多个程序集,原因是程序集名称不是完全指定的。例如,如果在该缓存中安装有 hello 1.0.0.0 3.2.2.1 两个版本,则 gacutil /u hello 命令会将这两个程序集都移除。

使用下面的示例以避免删除多个程序集。该命令只删除与完全指定的版本号、区域性和公钥匹配的 hello 程序集:

gacutil /u hello, Version=1.0.0.1, Culture="de",PublicKeyToken=45e343aae32233ca

下面命令将 assemblyList.txt 文件中指定的程序集安装到全局程序集缓存中:

gacutil /il assemblyList.txt

下面命令从全局程序集缓存中移除 assemblyList.txt 文件中指定的程序集:

gacutil /ul assemblyList.txt

下面命令将 myDll.dll 安装到全局程序集缓存中,并添加引用对其进行计数,跟踪引用。程序集 myDll.dll 由应用程序 MyApp 使用。UNINSTALL_KEY MyApp 参数指定将 MyApp 添加 Windows“添加/删除程序”中的注册表项。description 参数被指定为 My Application Description

gacutil /i /r myDll.dll UNINSTALL_KEY MyApp "My Application Description"

下面命令将 myDll.dll 安装到全局程序集缓存中,并添加引用对其进行计数,跟踪引用。scheme 参数 FILEPATH id 参数 c:/applications/myApp/myApp.exe 指定要安装 myDll.dll 应用程序的路径。description 参数被指定为 MyApp

gacutil /i /r myDll.dll FILEPATH c:/applications/myApp/myApp.exe MyApp

下面命令将 myDll.dll 安装到全局程序集缓存中,并添加引用对其进行计数,跟踪引用。scheme 参数 OPAQUE 允许您自定义 id description 参数:

gacutil /i /r mydll.dll OPAQUE "Insert custom application details here" "Insert Custom description information here"

下面命令移除应用程序 myApp myDll.dll 的引用。如果这是对该程序集的最后一个引用,则将同时从全局程序集缓存中移除该程序集:

gacutil /u /r myDll.dll FILEPATH c:/applications/myApp/myApp.exe MyApp

下面的命令列出全局程序集缓存的内容:

gacutil /l

 

参考

http://msdn.microsoft.com/zh-cn/library/yf1d93sz(v=VS.90).aspx
http://msdn.microsoft.com/zh-cn/library/ex0ss12c(v=VS.90).aspx

posted @ 2011-06-08 11:25  船长&CAP  阅读(238)  评论(0编辑  收藏  举报
免费流量统计软件