生成、打包、部署和管理应用程序及类型

本文介绍了如何在.NETFramework环境下生成、打包和部署应用程序,重点讨论了如何避免DLL冲突问题,通过模块生成PE文件,利用元数据和程序集的概念实现类型管理。同时,文章提到了程序集的版本资源、语言文化、简单部署策略以及配置文件在应用程序管理中的作用。

第2章 生成、打包、部署和管理应用程序及类型

背景

当今的应用程序都是由多个类型构成,这些类型通常都是由你和Microsoft创建的。除此之外,还有一些组件厂商们构建的一些专用类型。开发这些类型时,如果使用的语言是面向CLR的,这些类型就能无缝工作。本章将详细解释如何生成这些类型,并将其打包到文件中以进行部署。

2.1 .NET Framework 部署目标

所有应用程序都使用来自Microsoft或者其他厂商的动态链接库(DLL)。安装新应用程序时,它可能莫名其妙的破坏了另一个已经安装好的应用程序。这就是所谓的’“DLL hell”。.NET Framework正在尝试彻底解决DLL hell的问题

2.2 将类型生成到模块中

本节讨论如何将包含多个类型的源代码文件转变为可以部署的文件。

一个简单的示例程序

public sealed class Program
{
	public static void Main()
	{
		System.Console.WriteLine("Hi");
	}
}

在命令行执行以下命令:

csc.exe /out:Program.exe /t:exe /r:MSCorLib.dll Program.cs

命令行指示C#编译器生成名为Program.exe的可执行文件/out:Program.exe

类型是Win32控制台应用程序类型/t:exe (图形用户界面程序时winexe Windows Store应用是appcontainerexe)

/r:MSCorLib.dll 告诉编译器在MSCorLib.dll程序集中查找外部类型 实际因为这个dll太常用 可以忽略 会自动加载

这个生成的Program.exe文件,是标准PE(可移植执行体,Portable Executable)文件。运行32位或者64位的Windows的计算机可以加载它,并通过它执行某些操作。

响应文件

响应文件是包含一组编译器命令行开关的文本文件。执行CSC.exe时,编译器打开相应文件,并使用其中包含的所有开关

假定响应文件MyProject.rsp包含以下文本:

/out:Program.exe 
/t:exe

那么CSC.exe可以这样调用它

csc.exe @MyProject.rsp  Program.cs

C#编译器支持多个响应文件,除了在命令行上显式的指定的文件,编译器会自动查找名为CSC.rsp的文件。编译器汇总并使用所有响应文件中的设置,发生冲突时,优先级:命令行上显式的指定的设置覆盖本地设置,本地设置覆盖全局文件中设置。.NET Framework安装时会安装默认全局CSC.rsp文件,包含很多常用的dll,所以我们不必显式的引用这些dll。

2.3 元数据概述

知道了创建的是什么类型的PE文件,那么Program.exe文件中到底有什么呢

托管PE文件由4部分构成:PE32+头(是WIndows要求的标准信息),CLR头(是需要CLR模块特有的,包含模块生成式所面向的CLR信息),元数据以及IL。

元数据是由几个表构成的二进制数据块。定义表、引用表、清单表(定义表和引用表描述托管PE文件,清单表描述程序集

定义表:记录包括模块文件名和拓展名、模块版本ID;模块每个类型的名称、基类型、一些标志和索引;每个方法、每个字段、每个属性、每个参数、每个事件的信息

引用表:记录了所引用的内容,记录引用的每个程序集、每个PE模块、每个类型、每个引用的成员

2.4 将模块合并成程序集

Program.exe并非只是含有元数据的PE文件,它还是程序集

程序集:是一个或多个类型定义文件及资源文件的集合。

清单表:在程序集的所有文件中,有一个文件容纳了清单。清单也是一个元数据表集合,表中主要包含作为程序集组成部分的那些文件的名称,此外还描述了程序集的版本、语言文化、发布者、公开导出的类型以及构成程序集的所有文件。

CLR操作的是程序集,CLR总是首先加载包含“清单”元数据表的文件,再根据”清单“来获取程序集中其他文件的名称。

程序集的重要特征:

  • 程序集定义了可重用的类型
  • 程序集用一个版本号标记
  • 程序集可以关联安全信息

除了包含清单元数据的文件,程序集其他单独的文件并不具备上述特点

程序集多数时候只有一个文件,像Program.exe那样,然而,程序集还可以有多个文件构成:一些是含有元数据的PE文件,另一些是.gif或者.jpg这样的资源文件。便于理解,可将程序集视为一个逻辑的EXE或者DLL

生成程序集要么选择现有的PE文件作为“清单”的宿主,要么创建单独的PE文件并只在其中包含清单。

2.5 程序集版本资源文件

生成PE程序集文件时,还会再PE文件中嵌入标准的WIn32版本资源。

生成程序集时,应该使用定制特性设置各种版本资源字段

版本号格式

major(主版本号) minor(次版本号) build(内部版本号)  revision(修订号)

2.6 语言文化

创建含代码的程序集时一般不指定具体的语言文化。未指定具体语言文化的程序集称为语言文化中性。

创建一个或多个单独的程序集,只在其中包含语言文化特有的资源、不要包含任何代码。标记了语言文化的程序集称为附属程序集

2.7 简单应用程序部署(私有部署的程序集)

打包一组程序集最简单的方式就是直接复制所有文件。在应用程序基目录或者子目录部署的程序集称为私有部署的程序集,这是因为程序集文件不和其他任何应用程序共享。

2.8 简单管理控制(配置)

为了实现对应用程序的管理控制,可在应用程序目录放入一个配置文件。应用程序的发布者可创建并打包该文件。安装程序也会将配置文件安装到应用程序的基目录。计算机管理员或者最终用户也可以创建或修改该文件。CLR会解析文件内容来更改程序集文件的定位和加载策略。

配置文件包含XML代码,既可以和应用程序关联,也可以和机器关联。

例:假定应用程序的发布者想要把MultiFileLibrary的程序集文件部署到应用程序的程序集文件不同的目录,要求目录结构如下

AppDir目录(包含应用程序的程序集文件)
Program.exe
Program.exe.config
AuxFiles子目录(包含MultiFileLibrary的程序集文件)
MultiFileLibrary.dll
由于MultiFileLibrary.dll的文件不在应用程序的基目录,所以CLR无法定位并加载这些文件。运行程序将抛出异常。为了解决问题,发布者创建了XML格式的配置文件,并把它部署到应用程序的基目录。文件名必须是应用程序主程序集文件的名字,附加.config扩展名,也就是Program.exe.config。配置内容如下:

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

CLR尝试定位程序集文件,总是先在应用程序基目录查找,如果没找到,就查找AuxFiles子目录(可为probing元素的privatePath指定多个以分号分隔的路径。每个路径都相对于应用程序基目录,不能指定在应用程序基目录外部的目录)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值