• .NET框架程序设计生成,打包,部署及管理应用程序与类型(1:程序集的PE格式)


    .NET框架程序设计--生成,打包,部署及管理应用程序与类型(1:程序集的PE格式)

    (一).NET框架部署的目标

    提到Microsoft的OS--Windows,也许很多人立刻想到了她的复杂以及不稳定性,一个重大的原来是因为运行在Windows上各种程序都难以避免的DllHell(DLL地狱)问题,还有安装程序的复杂过程,以及程序对客户的不透明性,使得程序可以潜在地执行破环代码,修改注册表,发送客户的隐私等等这些客户不希望发生的行为。

    .NET框架对应用程序的部署,改良甚至修正了上述问题:DllHell基本解决(通过简单的Copy就可以部署程序,可谓是真正的绿色软件),代码访问安全机制模型(Code Access Security)更是在程序的安全方面迈出了一大步,我们(程序设计者)可以自己决定程序集的安全性,Windows用户可以对安装程序具有更多的控制。

    (二)将类型生成模块(.netmodule或者exe,dll文件(后两者就是Assembly程序集))

    我们可以通过编译器比如csc.exe来将类型生成这些模块.
    (1)CUI(Control User Interface控制台界面应用程序);比如:csc.exe App.cs
    (2)GUI(Graph User Interface图形界面应用程序);比如:csc /target:winexe App.cs
    (3)Dll(应用程序集,和以前概念的Dll--动态连接库应该有所区分);比如: csc /target:library App.cs
    (4)netModule(单个的托管模块,这些东西非简单集合组成Dll,更有助于我们管理类型);比如:csc /target:module App.cs

    抛开netModule,先看看Dll和exe(CUI,GUI)的内容的格式

    通过csc生成的Exe文件是一个标准的(托管)PE文件,可以运行于32,64位的Windows平台上。

    这个托管PE包括:
    (请参考http://www.cnblogs.com/caca/archive/2004/10/20/54810.html)

    (1)PE表头
    (用来表明这个程序是Windows应用程序,当然不是这么简单)
    (2)CLR表头
    (专门用于那些需要CLR才能运行的托管模块,包含元数据的主版本和次版本号,如果是exe文件还有一个标示入口点方法的MethodDef标记,以及一个可选的强命名数字签名,还有一些元数据表的大小和偏移量,察看SDK/include中的CorHdr.h的IMAGE_COR20_HEADER结构来得到CLR表头的准确格式)

    typedef struct IMAGE_COR20_HEADER
    {
        
    // Header versioning
        ULONG                   cb;              
        USHORT                  MajorRuntimeVersion;
        USHORT                  MinorRuntimeVersion;
        
        
    // Symbol table and startup information
        IMAGE_DATA_DIRECTORY    MetaData;        
        ULONG                   Flags;           
        ULONG                   EntryPointToken;
        
        
    // Binding information
        IMAGE_DATA_DIRECTORY    Resources;
        IMAGE_DATA_DIRECTORY    StrongNameSignature;

        
    // Regular fixup and binding information
        IMAGE_DATA_DIRECTORY    CodeManagerTable;
        IMAGE_DATA_DIRECTORY    VTableFixups;
        IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;

        
    // Precompiled image info (internal use only - set to zero)
        IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
        
    }
     IMAGE_COR20_HEADER;


    (3)元数据

    元数据是一些表的集合,这些表分成3类:定义表,引用表,清单表:
    定义表:例如ModuleDef,TypeDef,MethodDef,FiledDef,ParamDef,PropertyDef,EventDef......
    引用表:例如AssemblyRef,MouuleRef,TypeRef,MemberRef......
    清单表:例如AssemblyDef,AssemblyRef,FileDef,ManifestResoureeDef,ExportedTypesDef......
    (程序集中存在此表,.netmodule中没有)
    清单为程序集的使用者和其各个部分之间提供了一层间接关联,也使得程序集得以实现自描述,清单记录了程序集中所有的其他文件,但是其他文件并不知道他们是某个程序集的一部分。

    (4)IL代码

    程序源代码中中括号{}中的部分被编译成为IL语言。

    (附)具体看看hello.cs生成的MetaInfo(通过ILDasm的ctrl+M快捷键来查看)

    public class Hello
    {
        
    static void Main()
        
    {
            System.Console.WriteLine(
    "Hello c# world !");
        }

    }

    ScopeName : Hello.exe
    MVID      : {BC0BB08E-E11D-4DAC-866B-A584C5C8CD1A}
    ===========================================================
    Global functions
    -------------------------------------------------------

    Global fields
    -------------------------------------------------------

    Global MemberRefs
    -------------------------------------------------------

    TypeDef #1
    -------------------------------------------------------
     TypDefName: Hello  (02000002)
     Flags     : [Public] [AutoLayout] [Class] [AnsiClass]  (00100001)
     Extends   : 01000001 [TypeRef] System.Object
     Method #1 [ENTRYPOINT]
     -------------------------------------------------------
      MethodName: Main (06000001)
      Flags     : [Private] [Static] [HideBySig] [ReuseSlot]  (00000091)
      RVA       : 0x00002050
      ImplFlags : [IL] [Managed]  (00000000)
      CallCnvntn: [DEFAULT]
      ReturnType: Void
      No arguments.

     Method #2
     -------------------------------------------------------
      MethodName: .ctor (06000002)
      Flags     : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor]  (00001886)
      RVA       : 0x00002068
      ImplFlags : [IL] [Managed]  (00000000)
      CallCnvntn: [DEFAULT]
      hasThis
      ReturnType: Void
      No arguments.


    TypeRef #1 (01000001)
    -------------------------------------------------------
    Token:             0x01000001
    ResolutionScope:   0x23000001
    TypeRefName:       System.Object
     MemberRef #1
     -------------------------------------------------------
      Member: (0a000003) .ctor:
      CallCnvntn: [DEFAULT]
      hasThis
      ReturnType: Void
      No arguments.

    TypeRef #2 (01000002)
    -------------------------------------------------------
    Token:             0x01000002
    ResolutionScope:   0x23000001
    TypeRefName:       System.Diagnostics.DebuggableAttribute
     MemberRef #1
     -------------------------------------------------------
      Member: (0a000001) .ctor:
      CallCnvntn: [DEFAULT]
      hasThis
      ReturnType: Void
      2 Arguments
       Argument #1:  Boolean
       Argument #2:  Boolean

    TypeRef #3 (01000003)
    -------------------------------------------------------
    Token:             0x01000003
    ResolutionScope:   0x23000001
    TypeRefName:       System.Console
     MemberRef #1
     -------------------------------------------------------
      Member: (0a000002) WriteLine:
      CallCnvntn: [DEFAULT]
      ReturnType: Void
      1 Arguments
       Argument #1:  String

    Assembly
    -------------------------------------------------------
     Token: 0x20000001
     Name : Hello
     Public Key    :
     Hash Algorithm : 0x00008004
     Major Version: 0x00000000
     Minor Version: 0x00000000
     Build Number: 0x00000000
     Revision Number: 0x00000000
     Locale: <null>
     Flags : [SideBySideCompatible]  (00000000)
     CustomAttribute #1 (0c000001)
     -------------------------------------------------------
      CustomAttribute Type: 0a000001
      CustomAttributeName: System.Diagnostics.DebuggableAttribute :: instance void .ctor(bool,bool)
      Length: 6
      Value : 01 00 00 01 00 00                                >                <
      ctor args: ( <can not decode> )


    AssemblyRef #1
    -------------------------------------------------------
     Token: 0x23000001
     Public Key or Token: b7 7a 5c 56 19 34 e0 89
     Name: mscorlib
     Major Version: 0x00000001
     Minor Version: 0x00000000
     Build Number: 0x00001388
     Revision Number: 0x00000000
     Locale: <null>
     HashValue Blob:
     Flags: [none] (00000000)


    User Strings
    -------------------------------------------------------
    70000001 : (16) L"Hello c# world !"



    下篇:.NET框架程序设计--生成,打包,部署及管理应用程序与类型(2:Assembly的生成以及版本信息)
  • 相关阅读:
    JavaTPoint 移动开发教程【翻译完成】
    JavaTPoint 数据库教程【翻译完成】
    JavaTPoint PHP 中文教程【翻译完成】
    JavaTPoint .NET 中文教程【翻译完成】
    JavaTPoint 大数据和云计算中文教程【翻译完成】
    python基础学习笔记二:字符串相关知识
    python基础学习笔记(一):基本介绍
    python 基础学习三:数据结构对比
    python 基础学习五:关键字
    python基础学习笔记四:PEP8 Python 编码规范
  • 原文地址:https://www.cnblogs.com/caca/p/54919.html
Copyright © 2020-2023  润新知