第二章 生成,打包,部署及管理应用程序与类型
Ø 2.1 .NET框架部署目标
部署目标:
1. 解决“DLL hell”问题 DLL hell是指当安装新的应用程序时,却发现它损坏了一个现有的应用程序。
2. 组件不需要像COM那样在注册表中进行注册,应用程序不再需要快捷链接(还未实现)
3. 安全方面.NET框架包含了一个称作代码访问安全(code access security)的新型安全模型
Ø 2.2 将类型生成为模块
Windows支持两种类型的应用程序,即控制台用户界面(console user interface,简称CUI)应用程序和图形用户界面(graphical user interface,简称GUI)应用程序
元数据表的分类:定义表,引用表和清单表
构造器中的this指针指向构造器方法被调用时正在被构造的对象内存
Ø 2.3 将模块组合为程序集
在程序集包含的所有文件中,有一个文件用于保存清单(mainfest)。清单是另外一组元数据表的集合,其中主要包含了程序集中一部分文件的名称。另外,清单还描述了程序集的版本,语言文化,发布者,共有导出类型,以及组成该程序集的所有文件。
程序集是CLR操作的对象,也就是说CLR总是先加载包含清单元数据表的文件,然后利用该清单来获取程序集中的其他文件。
使用多文件程序集的原因:
1. 可以将类型分别实现在不同的文件中,从而允许文件在互联网环境中进行增量下载。
2. 可以按需要向程序集中添加资源或数据文件(借助工具AL.exe实现)
3. 可以使我们创建的程序集包含一些用不同编程语言实现的类型
程序集是一个可重用,可实施版本策略和安全策略的单元
要生成一个程序集,我们必须为其选择一个PE文件作为清单的保存者,我们也可以创建一个单独的PE文件,让它除了清单外不包括其他任何内容。
虽然包含清单的文件知道程序集中的其他文件,但其他文件本身却并不清楚它们是一个程序集的一部分。
C#编译器通过/t[arget]:module命令行开关可以产生一个不包括清单元数据表的PE文件,默认的输出扩展名为.netmodule的文件
Visual Studio .NET IDE本身不支持创建多文件程序集,必须求助于命令行工具。
使用/addmodule命令行开关可以向程序集加载.netmodule文件
要生成一个程序集,其引用的所有文件都必须存在
只有当引用一个类型的方法被调用时,CLR才会加载该类型所在的程序集文件。这意味着一个应用程序的运行并不需要其引用的程序集中所有的文件都存在。
Ø 2.3.1 使用Visual Studio .NET IDE为项目添加程序集引用
其中添加引用对话框上的COM选项卡允许托管代码访问非托管的COM服务器。项目选项卡允许目前的项目引用同一个解决方案中其他项目创建的程序集。
Ø 2.3.2 使用程序集链接器
AL.exe可以产生一个除了清单外不包括任何其他内容的EXE或者DLL PE文件
程序集链接器不能将多个文件组合成一个单独的文件
Ø 2.3.3 在程序集中包含资源文件
两种方式加载资源文件:
1. 嵌入 /embed[resource] 将一些资源文件添加到程序集中,其中的内容将嵌入到产生的PE文件中
2. 链接 /link[resource] 仅反映资源的存在,并标识出程序集的哪个文件包含着资源文件,资源文件仍保持着独立,并且必须和其他程序集文件一起打包,部署
我们也可以把标准的Win32资源嵌入到一个程序集中,通过添加命令行开关/win32res,并指定一个.res文件路径来实现
还可以添加/win32icon命令行开关,并指定一个.ico路径,将一个标准的win32图标资源嵌入到程序集文件中,通过这样可以在Windows的资源管理器中将一个托管的exe文件显示为一个指定的图标。
Ø 2.4 程序集版本资源信息
当使用Visual Studio .NET创建C#项目时,它会自动为我们产生一个AssemblyInfo.cs文件,该文件包括了本节描述的几乎所有的程序集特性。
Ø 2.4.1 版本号
用来唯一的标识一个程序集
Ø 2.5 语言文化
我们再创建一个或多个包含特定语言文化资源的单独的程序集——这些程序集将不包含任何代码。这些标识着特定语言文化的程序集又称卫星程序集。通常用AL.exe工具来创建卫星程序集。我们所创建的程序集一般不该引用卫星程序集。
Ø 2.6 简单应用程序部署(私有部署程序集)
.cab文件可以压缩文件以节省下载时间
MSI文件允许程序集在CLR第一次加载它时才被安装
和应用程序部署在同一目录下的程序集称为私有部署程序集,因为这些程序集文件不会为其他任何应用程序所共享
每一个程序集都包含着描述自己的一些原数据,这些原数据指出了程序集在运行时需要加载哪些其他的程序集,不再需要设置注册表或活动目录。
Ø 2.7 简单控制管理(配置)
为了对一个应用程序进行管理控制,我们可以在应用程序的目录下安放一个配置文件。应用程序的发布者可以创建,打包该文件。安装程序则应该将该配置文件安装在应用程序的基目录下。另外管理员和终端用户应该能够创建或者修改该文件。CLR通过解析该文件的内容来改变其定位和加载程序集时的策略。
配置文件的名称必须是应用程序的名称再加一个.config扩展名,对于ASP.NET WEB窗体和XML WEB服务应用程序,名称总是web.config。对于客户方控件和以微软的IE浏览器为宿主的程序集,HTML页面必须包含一个链接标记,其中的rel属性设置为configuration,而将href设置为配置文件的URL
特定应用程序的配置文件中的设置会覆盖Machine.config(.NET框架的配置文件)文件中的相应设置