CLR via C# 第2章 生成、打包、部署和管理应用程序与类型2.8 简单管理控制(配置)
用户或管理员可以在很大程度上决定应用程序的执行。例如,管理员可以决定将程序集文件移动到用户硬盘上,或者重写程序集清单中的信息。
要对应用程序进行管理控制,可以在程序目录中放置一个配置文件。程序发布者创建该配置文件并打包。此外,机器的管理员或最终用户也可以创建或修改。CLR通过解析该文件的内容来更改定位和加载程序集文件的策略。
这些配置文件都是XML格式的,可以和应用程序或计算机相关联。使用单独的文件(相比注册表)可以轻松地备份,并且允许管理员将应用程序拷贝到另外一台机器——只拷贝必要的文件和管理策略。
假设应用程序的发布人员希望将应用程序的JeffTypes程序集部署其他目录。目录结构如下:
AppDir directory (contains the application’s assembly files) Program.exe Program.exe.config (discussed below) AuxFiles subdirectory (contains JeffTypes’ assembly files) JeffTypes.dll FUT.netmodule RUT.netmodule如果JeffTypes不在应用程序根目录中,CLR将无法找到并进行加载,运行程序时将抛出System.IO.FileNotFoundException异常。要解决这个问题,发布者需要创建一个XML配置文件,并将其部署在应用程序的根目录。文件名必须为应用程序主程序集文件加上.config扩展:例如Program.exe.config。配置文件内容如下:
<configuration> <runtime> <> </> </assemblyBinding> </runtime> </configuration>在CLR定位程序集文件时,会先到应用程序目录中查找,如果没有找到将在AuxFiles子目录中查找。在probing元素的privatePath属性中,可以用分号间隔多个路径。每个路径都是相对于应用程序根目录的。不能通过绝对路径或相对路径指定应用程序根目录以外的目录。应用程序只能控制自己所在的目录及其子目录,而不能控制其他目录。
应用程序的类型不同,配置文件的名称和位置也不同:
正如本节开始时所提到的,配置设置可以应用于一个特定的应用程序,也可以应用于整个机器。当安装.NET Framework时,创建了Machine.config文件。每个版本的CLR都有对应的Machine.config文件,位置为:
%SystemRoot%\Microsoft.NET\Framework\version\CONFIG当然,%SystemRoot%为Windows目录(通常为C:\WINDOWS),version为.NET Framework的版本号(如v4.0.#####)。
Machine.config中的设置为默认设置,将影响所有运行在该机器上的应用程序。管理员只需要修改一个Machine.config文件就可以创建应用于整个机器范围的策略。但是管理员和用户都应该避免修改该文件,因为它包含了和许多内容都相关的设置,这使得它非常难以浏览。另外,我们还希望能够备份和恢复应用程序的设置,将设置保存在特定应用程序的配置文件中可以实现这一目的。
程序集文件的定位
在CLR定位程序集时,将扫描多个子目录。扫描一个区域中性的程序集时所检查的目录顺序如下(firstPrivatePath和secondPrivatePath在config文件的privatePath属性中注明了):
AppDir\AsmName.dllAppDir\AsmName\AsmName.dll
AppDir\firstPrivatePath\AsmName.dll
AppDir\firstPrivatePath\AsmName\AsmName.dll
AppDir\secondPrivatePath\AsmName.dll
AppDir\secondPrivatePath\AsmName\AsmName.dll
...
在本例中,如果JeffTypes程序集文件部署在JeffTypes子目录中,就不需要任何配置文件了,因为CLR自动检查以程序集名称命名的子目录。
如果在上述子目录中无法找到程序集,CLR将用.exe扩展名代替.dll扩展名继续查找。如果仍然无法找到,将抛出FileNotFoundException。
对于卫星程序集,将遵循同样的规则,而且和区域同名的子目录也在扫描范围内。例如,如果AsmName.dll的区域为"en-US",将扫描以下目录:
C:\AppDir\en-US\AsmName.dllC:\AppDir\en-US\AsmName\AsmName.dll
C:\AppDir\firstPrivatePath\en-US\AsmName.dll
C:\AppDir\firstPrivatePath\en-US\AsmName\AsmName.dll
C:\AppDir\secondPrivatePath\en-US\AsmName.dll
C:\AppDir\secondPrivatePath\en-US\AsmName\AsmName.dll
C:\AppDir\en-US\AsmName.exe
C:\AppDir\en-US\AsmName\AsmName.exe
C:\AppDir\firstPrivatePath\en-US\AsmName.exe
C:\AppDir\firstPrivatePath\en-US\AsmName\AsmName.exe
C:\AppDir\secondPrivatePath\en-US\AsmName.exe
C:\AppDir\secondPrivatePath\en-US\AsmName\AsmName.exe
C:\AppDir\en\AsmName.dll
C:\AppDir\en\AsmName\AsmName.dll
C:\AppDir\firstPrivatePath\en\AsmName.dll
C:\AppDir\firstPrivatePath\en\AsmName\AsmName.dll
C:\AppDir\secondPrivatePath\en\AsmName.dll
C:\AppDir\secondPrivatePath\en\AsmName\AsmName.dll
C:\AppDir\en\AsmName.exe
C:\AppDir\en\AsmName\AsmName.exe
C:\AppDir\firstPrivatePath\en\AsmName.exe
C:\AppDir\firstPrivatePath\en\AsmName\AsmName.exe
C:\AppDir\secondPrivatePath\en\AsmName.exe
C:\AppDir\secondPrivatePath\en\AsmName\AsmName.exe
如你所见,CLR探测所有.exe或.dll为扩展名的文件。由于探测过程十分耗时(特别是在CLR通过网络查找文件时),在XML配置文件中,可以指定一个或多个culture元素来限制在查找卫星程序集时CLR所执行的探测。
CLR via C# 第2章 生成、打包、部署和管理应用程序与类型&2.8 简单管理控制(配置)