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

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属性为配置文件的地址

你可能感兴趣的:(应用程序)