CLR via C# 读书笔记2-7

来源:互联网 发布:程序员的烦恼 编辑:程序博客网 时间:2024/05/29 02:11

简单的管理控制 (配置)

用户能够使用一个配置文件来控制程序的运行, CLR 会读取其中的内容来调整定位/载入程序集的策略。
这些配置文件以 XML 格式书写,并与某个程序/机器进行关联。使用一个独立的配置文件(而不是注册表)使得这些设定能够更容易的分发。这里先举个实际应用的例子:

计划配布的产品目录:

AppDir directory (产品根目录)|- Program.exe|- Program.exe.config (配置文件)|- AuxFiles (子目录,存放参照的程序集/第三方类库)    |- MultiFileLibrary.dll    |- FUT.netmodule    |- RUT.netmodule

由于参照的类库(MultiFileLibrary 等文件) 不存放在主程序同一层目录中, CLR 会找不到这些文件,导致运行后发生 System.IO.FileNotFoundException 异常。为了解决这个问题就需要配置文件的介入(命名规则为主程序加上 .config 扩展名),以下是其中的内容

<configuration><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><probing privatePath="AuxFiles" /></assemblyBinding></runtime></configuration>

现在 CLR 定位一个程序集时,会先检索程序目录(和之前一样),如果他不能发现需要的程序集,就会继续查找 AuxFiles 子文件夹。这里你还可以指定多个子目录,但是需要注意的是你不能指定一个程序目录之外的目录(不管是通过绝对路径还是相对路径)。你可以这样理解:应用程序能够管理它自身的目录(包括其下的子目录),但是不能管理除此之外的目录。

对于CLR来说查找到需要的程序集是个耗时的处理,特别是以下场合:

  1. 配置文件中定义了许多privatePath
  2. 需要对应多culture
  3. 查找的路径是网络路径

第1,第3中情况应尽量避免;对于第2种情况,你可以在配置文件中明确指定支持的culture,这样CLR 在查找satellite assemblies 时不用遍历所有culture从而节约部分时间。如果你的程序在查找程序集时有问题,可以借助 Microsoft 的一个小工具: FusLogVw.exe(http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx)。

配置文件的命名与存放路径取决于程序的种类:
■ 对于可执行文件 (EXE),配置文件必须存放在程序的根目录,而且必须命名为程序文件加 “.config”
■ 对于Microsoft ASP.NET Web Form 程序,文件必须存放在 Web 程序的虚拟根目录,并且命名为 Web.config。另外,这种场合下子目录也可以包含 Web.config 文件,这其中的设定会被继承。

前面提到过配置文件能和某台机器相关联:当你安装 .NET Framework 时,他建立一个 Machine.config 文件并存放在以下目录
%SystemRoot%\Microsoft.NET\Framework\version\CONFIG
其中的设定会对所有本机运行的程序产生影响。