2 生成、打包、部署和管理应用程序及类型
- PE:Portable Executable(可移植执行体)
2.1 .NET Framework部署目标
- 现在Microsoft Windows中部署应用程序的问题:(目标就是解决这些问题)
1、 Dll hell:更新旧的dll时,由于之前很多应用都引用了旧的dll,发布新dll前不可能对所有应用程序进行测试。就有可能你更新一个dll造成其他应用程序运行不了。
2、 安装应用程序很复杂:需要复制文件到各个目录,要更新注册表,要在桌面开始菜单快速启动栏安装快捷方式。而且复制一个程序到另一台机器不能直接使用,还要重新安 装
3、 不安全:安装的应用程序的各种文件由不同公司编写。而且web应用程序会悄悄下载一些代码
- 解决:类型不需要像COM那样注册注册表,解决DLL Hell,安全机制
2.2 将类型集成到模块中
- 这个标题意思实际上就是我们平时在vs中添加引用的过程。
- CSC.exe运行时会去找一个本地的应答文件中CSC.rsp与CSC.exe同目录,其中列出了默认引用的一些dll
- PE:Portable Executable(可移植执行体)
2.3元数据概述
- 托管PE(exe,dll文件)由四部分构成:PE32+头,CLR头,元数据和中间语言
- 元数据:一个二进制数据块,由几个表组成:定义表(ModuleDef,TypeDef,MethodDef,FieldDef,ParamDef,PropertyDef,EventDef),引用表(AssemblyRef,ModuleRef,TypeDef,MemberRef),清单表
- 如何查看元数据:ILDasm.exe即IL反编译器打开托管PE(exe或者dll)视图->元信息->显示
- 查看程序集统计信息:ILDasm.exe中选择视图=>统计
2.4 合并模块以构成一个程序集
- 程序集:一个或者多个类型定义文件(.cs文件)及资源文件的集合。
- CLR操作程序集:CLR操作的是程序集。程序集中包含一个“清单”,清单包含有一些列元数据表,表中是程序集成员的名称,及其他信息。CLR操作的是程序集,以清单为入口,用清单来获取其他文件名称。
- 程序集分类:单文件(PE文件)和多文件程序集(PE文件+资源文件(gif,jpg文件))
- 为什么使用程序集:将常用类型放一个程序集,不常用放一个,配置应用程序时,只配置常用,不常用的给个地址,需要时下载。
- 为什么使用多文件程序集
1、可以用单独的dll或者exe来对自己的写的类进行划分。好处:选择性下载和部署时可以部分部署
2、在dll中或者exe中(程序集)嵌入资源或数据文件(jpg,gif),资源文件和我们打代码就合在一起了
3、用不同编程语言实现程序集的各个类型
- 疑问:多文件程序集概念,由于师兄解答
多文件程序集的两种情况:
1、多个dll或者exe
2、单个dll或者exe但是dll exe中嵌入了资源文件
- 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)
- VS2005不支持创建多个程序集dll exe
- 要么选择一个自己的PE文件作为清单的宿主,这个PE文件就成为程序集。要么单独建立一个PE文件只在其中包含清单。
2.4.1使用Visual Studio IDE在项目中添加程序集
2.4.2使用程序集链接器
- 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函数
2.4.3在程序集中包含资源文件
- 创建程序集包含资源文件的两种方式:1、嵌入2、链接
2.5程序集版本资源信息
- 在Visual Studio中新建一个C#项目时,会自动创建一个AssemblyInfo.cs文件,此文件包含程序集版本信息。
- 版本号四个部分:2.5.179.13 我们一般认为版本好就是2.5,2是主版本号,5是副版本号。
- 在vs2010中项目属性-应用程序-启动对象设置了之后,查看启动文件属性中就有详细信息了
2.6 语言文化
- 语言文化中性程序集:包含代码的程序集,通常不会指定一种语言文化,因为代码很少与语言文化相关,这种程序集称为~
- 附属程序集:使用一种具体语言文化标记的程序集称为~
- 处理包含特定语言文化资源程序集方法:首先创建一个语言文化中性程序集其中只包含代码和默认资源,然后创建一个或者多个附属程序集用特定语言标记。通常用AL.exe /c[ulture]:text开关来指定一种语言文化。Text是一个语言文化字符串如:en-US,代表美式英语。具体部署应用程序时,在exe所在文件夹新建一个文件夹存储对应附属程序集如c:/MyApp/en-US。
2.7 简单应用程序部署(私有部署的程序集)
- 私有部署程序集:部署到与应用程序相同目录中的程序集称为~
- 优点:备份还原简单,因为都在一个目录,CLR也好加载,因为有元数据,不需要注册表设置。
2.8 简单管理控制
- 如何控制:在应用程序目录放置一个配置文件(xml代码),可以改变程序集文件的定位和加载策略
- CLR定位一个程序集文件时总是先在应用程序基目录查找。如果没有就找子目录,这就需要在config文件中进行子目录的设置。(相对目录,不是绝对目录)应用程序能控制它在得 目录及子目录,其他目录控制不了
- 例子:AppDir(文件夹)
App.exe
App.exe.config
SonFiles(文件夹)
b.dll
如果没有配置文件,app.exe就找不到需要加载的b.dll,在配置文件中设置privatePath=”Sonfiles”,就行了
- 不同应用程序config文件名称与位置:
Exe:与exe在一个目录,与exe全名同名再加.config.如a.exe.config
asp.net Web窗体:Web应用程序根目录,命名Web.config。子目录也有对应Web.config文件,而且应用程序可以用子目录中的config文件
IE客户端控件:HTML页包含一个link,rel属性为Configuration,href属性为配置文件的地址