第二章 生成丶打包丶部署和管理应用程序及类型
2.1 .NET Framework部署目标
Windows 多年来一直因为不稳定和过于复杂而口碑不佳。原因:首先所有应用程序都要使用动态链接库(Dynamic-Link Library,DLL)
1.安装新应用程序时,它可能莫名奇妙破坏另一个已经安装好的应用程序。这就是"DLL hell"。
2.是安装的复杂性。
3.设计安全性。
2.2 将类型生成到模块中
通过命名生成可执行程序。(标准PE文件)
csc.exe 文件名.cs
生成“文件名.exe”可执行文件。
Windows支持三种应用程序:
控制台用户界面(Console User Interface,CUI) /t:exe 开关
图形用户界面(Graphical User Interface,GUI)/t:winexe开关
Windows Stroe 应用 /t:appcontainerexe开关
使用命令:csc.exe /t:exe|/t:winexe|/t:appcontainerexe 文件名.cs
响应文件:是包含一组编译器命名行开关的文本呢文件。
使用命令:csc.exe @响应文件 文件名.cs
2.3 元数据概述
CLR头是一个小的信息块,是需要CLR的模块特有的。这个头包含模块生成时所面向的CLR的major(主)和minor(次)版本号;一些标志(flag);一个MethodDef token,该token指定了模块的入口方法;一个可选的强名称数字签名。还包含模块内部的一些元数据表的大小和偏移量。
元数据是由几个表构成的二进制数据块:
定义表(definition table)
引用表(reference table)
清单表(manifest table)
2.4 将模块合并成程序集
程序集是一个或多个类型定义文件及资源文件的集合。其中一个文件容纳了清单。清单也是一个元数据表集合,表中主要包含作为程序集组成部分的那些文件名称。此外,还描述了程序集的版本,语言文化,发布者,公开导出的类型以及构成程序集的所有文件。
CLR操作的是程序集。换言之,CLR总是首先加载包含“清单"元数据表的文件,再根据“清单”来获取程序集中的其他文件的名称。
重要特点:(包含清单元数据表的文件)
程序集定义了可重用的类型。
程序集用一个版本号标记。
程序集可以关联安全信息。
程序集是进行重用,版本控制和应用安全性设置的基本单元。它允许将类型和资源文件划分到单独的文件中。件程序集:包含元数据的PE文件和.gif或.jpg资源文件。
使用理由:
1. 不同类型用不同的文件,使文件能以“增量”方式下载。将类型划分到不同的文件中,可以对购买和安装的应用程序进行部署或分批打包/部署
2. 可在程序集中添加资源或数据文件。
3. 程序集包含各个类型可以用不同的编程语言来实现。
清单元数据表
客户端代码执行时会调用方法。一个方法首次调用时,CLR检测作为参数,返回值或者局部变量而被方法引用的类型。然后,CLR尝试加载所引用程序集中含有清单的文件。如果要访问的类型恰好再这个文件中,CLR会执行其内部登记工作,允许使用改类型。如果清单指出被引用的类型在不同的文件中,CLR会尝试加载需要的文件,同样执行内部登记,并允许使用改类型。
2.4.1 使用Visual Studio IDE将程序集添加到项目中
这个大家都应该都非常熟悉啦。
2.4.2 使用程序集链接器
”程序集链接器“AL.exe。
可以 生成只包含资源的程序集(附属程序集),用于本地化。能生成EXE文件 ,或者生成只包含清单(对其他模块中的类型进行描述)的DLL PE文件。
2.4.3 为程序集添加资源文件 [AL.exe]
/embed[resoure]开关将文件作为资源添加到程序集。 该开关获取任意文件,并将文件内容嵌入最终的PE文件。【CSC.exe /resource】
/link[resource]开关:只更新清单的ManifestResourceDef和FileDef表以反映新资源的存在,指出资源包含在程序集的哪个文件中。资源不会嵌入程序集PE文件中;它保持独立,而且必须和其他程序集文件一起打包和部署。 【CSC.exe linkresource】
2.5 程序集版本资源信息
AL.exe或CSC.exe生成PE文件程序集时,还会在PE文件中嵌入标准的Win32版本资源。
版本信息:
FileDescription,Comments,CompanyName,ProductName,LegalCopyright,LegalTrademarks,AssemblyVersion,FILEVERSION/FileVersion,PRODUCTVERSION/ProductVersion
版本号格式
major(主版本号),minor(次版本号),build(内部版本号),revision(修订号)。
三个版本号:
AssemblyFileVersion:这个版本号存储在Win32版本资源中,它仅供参看,CLR既不检查,也不关心这个版本号。在Windows资源管理器中能看到这个版本号。对客户系统进行故障诊断时,可根据它识别程序集的版本是多少。
AssemblyInformationVersion:这个版本号也存储在Win32版本资源中,同样仅供参考。CLR既不检查,也不关心它。这个版本号的作用是指出包含程序集的产品的版本。
AssemblyVersion:这个版本号存储在AssemblyDef清单元数据表中。CLR在绑定到强命名程序集时会用到它。它唯一性地标识了程序集。
2.6 语言文化
程序集将语言文化(culture)作为其身份标识的一部分。语言文化用包含主副标记的字符串进行标识。
创建含代码的程序集时一般不指定具体的语言文化,未指定具体语言文化的程序集称为语言文化中性(culture neutral)。
标记了语言文化的程序集称为附属程序集。
为附属程序集指定的语言文化应该准确反映程序集中的资源的语言文化。针对想要支持的每种语言文化都要创建单独的附属程序集。
一般不要生成引用了附属程序集的程序集。要访问附属程序集中的类型或成员,应使用反射技术。
2.7 简单应用程序部署(私有部署的程序集)
Visual Studio会将应用程序所有必要的程序集打包成一个.appex文件。该文件可以上传到Windows Store或者side-load到机器。注:不经应用商店而将软件拷贝到设备上,就称为side-load。
用户安装.appx文件时,其中包含的所有程序集都要进入一个目录。CLR从该目录加载程序集。
非Windows Store的桌面应用,程序集的打包方式没有人任何特殊要求。可以直接复制所有文件,如将所有程序集文件放到光盘上,将上面的文件复制到用户上的一个目录。也可以使用.cab文件。还可以将程序集文件打包成一个MSI文件,以便由Windows Installer(MSIEcex.exe)服务使用。使用MSI文件可实现“按需安装”。也可使用Visual Stuido 内建的机制发布应用程序。
在应用程序基目录或者子目录部署的程序集称为私有部署的程序集,这是因为程序集不和其他任何应用程序共享。
2.8 简单管理控制(配置)
为了实现对应用程序的管理控制,可在应用程序目录放入一个XML格式配置文件。它既能和应用程序关联,也能和机器关联。CLR会解析文件内容来更改程序集文件的定位和加载策略。
配置文件名称和位置:
对于可执行应用程序(exe),配置文件必须在应用程序的基目录中,而且必须采用exe文件全名作为文件名,再附加.config扩展名。
对于Microsoft ASP.NET Web窗体应用程序,文件必须在Web应用程序的虚拟根目录中,而且总是命名为Web.config。子目录也可以包含自己的Web.config,而且配置设置会得到继承。
配置设置既可应用于程序,也可应用于机器。.NET Framework在安装时会创建一个Machine.config。机器上安装的每个版本的CLR都有一个对应的Machine.config。
Machine.config文件的设置时机器上运行的所有应用程序的默认设置。