CLR via C# 3 读书笔记(16):第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 xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="AuxFiles" />
    </assemblyBinding>
  </runtime>
</configuration>

在CLR定位程序集文件时,会先到应用程序目录中查找,如果没有找到将在AuxFiles子目录中查找。在probing元素的privatePath属性中,可以用分号间隔多个路径。每个路径都是相对于应用程序根目录的。不能通过绝对路径或相对路径指定应用程序根目录以外的目录。应用程序只能控制自己所在的目录及其子目录,而不能控制其他目录。

应用程序的类型不同,配置文件的名称和位置也不同:

  • 对于可执行应用程序(EXE),配置文件必须在应用程序根目录,名称必须为EXE文件加上.config。
  • 对于ASP.NET Web Form应用程序,文件必须在Web应用程序的虚拟根目录中,名称通常为Web.config。此外,子目录也可以有自己的Web.config文件,配置的设置是可继承的。例如,一个位于http://Wintellect.com/Training的Web应用可能同时使用虚拟根目录下的Web.config文件和Training子目录下的Web.config文件。

正如本节开始时所提到的,配置设置可以应用于一个特定的应用程序,也可以应用于整个机器。当安装.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.dll
AppDir\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.dll
C:\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所执行的探测。

posted @ 2010-04-20 15:00  麒麟.NET  阅读(1910)  评论(4编辑  收藏  举报