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

.Net Framework部署目标

现在Microsoft Windows中部署应用程序的问题:(目标就是解决这些问题)
1、Dll hell更新旧的dll时,由于之前很多应用都引用了旧的dll,发布新dll前不可能对所有应用程序进行测试。就有可能你更新一个dll造成其他应用程序运行不了。
2、安装应用程序很复杂:需要复制文件到各个目录,要更新注册表,要在桌面开始菜单快速启动栏安装快捷方式。而且复制一个程序到另一台机器不能直接使用,还要重新安装
3、不安全:安装的应用程序的各种文件由不同公司编写。而且web应用程序会悄悄下载一些代码
解决:类型不需要像COM那样注册注册表,解决DLL Hell,安全机制

将类型生成到模块中

主要讨论将包含多个类型的源代码文件生成一个可部署的文件
class Program { static void Main(string[] args) { System.Console.WriteLine("Hi"); } } 首先这个是个名为Program的类型,其中包括System.Console类型
执行命令行:
csc.exe /out:Program.exe /t:exe /r:MSCorLib.dll Program.cs
这个命令行指示C#编译器生成一个名为Program.exe的可执行文件(/out:Program.exe)。
生成的文件属于Win32控制台应用程序类型(/t[arget]:exe)
System.Console是MS已经实现好的一个类型,其定义存于MSCorLib.dll文件中
所以为了顺利通过编译,必须向C#编译器提供对外部类型的引用,即 /r[eference]:MSCorLib.dll
MSCorLib.dll是个特殊的文件,它包含了所有核心类型:Byte、Char、String、Int32
简化写法:csc.exe Program.cs
由于MSCorLib.dll会被C#编译器自动引用,所以在不想引用的时候使用/nostdlib开关
csc.exe /out:Program.exe /t:exe /nostdlib Program.cs //会报错
Program.exe是个标准的PE文件,具有控制台用户界面(CUI:console user interface)
使用/t:winexe开关,编译成GUI应用程序

响应文件Response File

首先是一个文本文件,其中包含编译器的一组命令行开关,假如一个名为MyProject.rsp的响应文件包含以下文本
/out:MyProject.exe /target:winexe 可以这样调用
csc.exe @MyProect.rsp CodeFile1.cs CodeFile2.cs

元数据概述

元数据是一个二进制数据块,由几个表构成,这些表分为三个类别:定义表、引用表和清单表
常用的元数据定义表:
ModuleDef、TypeDef、MethodDef、FieldDef、ParamDef、PropertyDef、EventDef
常用的引用元数据表:
AssemblyRef、ModuleRef、TypeDef、MemberRef
用ILDasm.exe加载一个PE文件的元数据

将模块合并成程序集

一个程序集并非仅仅是一个含有元数据的PE文件,还是一个或多个类型定义文件及资源文件的集合(mainfest容纳了所有文件的清单,也是一组元数据表的集合),
它们还描述了程序集的版本、语言文化、发布者、公开导出的类型以及构成程序集的所有文件。
程序集的一些重要特征:

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

程序集的作用:可重用类型逻辑表示和物理表示能够分开。
一个程序集可以由多个文件,使用多个文件程序集的原因:

  • 分片出售、下载、安装,即:可以用单独的dll或者exe来对自己的写的类进行划分。好处:选择性下载和部署时可以部分部署
  • 在程序集中加入资源和数据文件,即:在dll中或者exe中(程序集)嵌入资源或数据文件(jpg,gif),资源文件和我们打代码就合在一起了
  • 多语言分别实现,即:用不同编程语言实现程序集的各个类型

生成一个程序集必须选择自己的一个PE文件作为“清单”宿主。作用:用户不必关系程序集的划分细节,使程序集有了自描述性。
清单元数据表:AssemblyDef、FileDef、MainfestResourceDef、ExportedTypesDef
CLR操作程序集:CLR操作的是程序集。程序集中包含一个“清单”,清单包含有一些列元数据表,表中是程序集成员的名称,及其他信息。CLR操作的是程序集,以清单为入口,用清单来获取其他文件名称。
程序集分类:单文件(PE文件)和多文件程序集(PE文件+资源文件(gif,jpg文件))
多文件程序集的两种情况:
1、多个dll或者exe
  2、单个dll或者exe但是dll exe中嵌入了资源文件
1).•csc /t:module A.cs 指示编译器生成不含清单表的清单文件,一般总是一个DLL,生成的文件为A.netmodule.
接下来,要把这个netmodule文件附加到一个有清单表的程序集中,使用addmodule开关:csc /out:FinalAssmbly.dll /t:library /addmodule:A.netmodule B.cs
这里B.cs包含清单表,最终生成FinalAssmbly.dll,如果A.netmodule不存在,便一起会报错。但是运行程序时,A.netmodule可以不存在,仅在调用其中的方法时,
才会加载A.netmodule(想到了程序部署,部署时就是生成清单文件,最后生成一个总的exe或者dll)
2).•VS2005不支持创建多个程序集dll exe
3).•要么选择一个自己的PE文件作为清单的宿主,这个PE文件就成为程序集。要么单独建立一个PE文件只在其中包含清单

使用程序集链接器

AL.exe可以生成exe或者dll PE文件,其中包含对其他模块中类型进行描述的一个清单
Csc /t:module a.cs
  Csc /t:module b.cs
  Al/out: final.dll /t: library a.netmodule b.netmodule
C#编译器先把两个cs文件编译成模块,两个模块都不是程序集,因为不包含清单数据。AL生成第三个文件final.dll,它不包含IL代码,只有清单数据。最后的程序集由这三个文件构成 AL.exe还可以生成CUI GUI PE文件,很少用因为要指定入口main函数

为程序集添加资源文件

创建程序集包含资源文件的两种方式:
/embed[resource] 开关来实现,并将文件内容嵌入到最终的PE文件中 /link[resource]开关来实现 ,资源文件不会嵌入到程序集PE文件

程序集版本资源信息

在Visual Studio中新建一个C#项目时,会自动创建一个AssemblyInfo.cs文件,此文件包含程序集版本信息
版本号四个部分:2.5.179.13 我们一般认为版本好就是2.5,2是主版本号,5是副版本号
在vs2010中项目属性-应用程序-启动对象设置了之后,查看启动文件属性中就有详细信息了

语言文化

语言文化中性程序集:包含代码的程序集,通常不会指定一种语言文化,因为代码很少与语言文化相关
附属程序集:使用一种具体语言文化标记的程序集
处理包含特定语言文化资源程序集方法:首先创建一个语言文化中性程序集其中只包含代码和默认资源,
然后创建一个或者多个附属程序集用特定语言标记。通常用AL.exe /c[ulture]:text开关来指定一种语言文化。
Text是一个语言文化字符串如:en-US,代表美式英语。具体部署应用程序时,在exe所在文件夹新建一个文件夹存储对应附属程序集如c:/MyApp/en-US

原文地址:https://www.cnblogs.com/hailiang2013/p/2851217.html