• C#读书笔记(框架设计第二版:CLR VIA C#)—— 一些生成、打包、部署和管理应用程序的核心概念


                                    第一部分:一些生成、打包、部署和管理应用程序的核心概念

    实现了System.Console方法在MSCorLib.dll中;
    MSCorLib.dll包含所有核心的类型:Byte,Char,String,Int32等。由于该程序集使用频繁,C#编译器会自动引用该程序集。

    应答文件:应答文件是一个文本文件,其中包含一系列的编译器命令行开关;

    托管PE文件:PE32(+)头、CLR头、元数据以及中间语言的那些模块所特有的。

    CLR 头:为一个信息块,包含用于生成模块的CLR的主,副版本号;一些标志(flag);一个MEthodDef标记,他指定了模块的入口方

    法;以及一个可选的强名称数字签名;最后含有模块内部的特定元数据表的大小和偏移量。具体格式可以参考 CorHdr.h文件的

    IMAGE_COR20_HEADER定义(在..\Microsoft Visual Studio 8\SDK\v2.0\include)。如下所示:

     1// COM+ 2.0 header structure.
     2typedef struct IMAGE_COR20_HEADER
     3{
     4    // Header versioning
     5    DWORD                   cb;              
     6    WORD                    MajorRuntimeVersion;
     7    WORD                    MinorRuntimeVersion;
     8    
     9    // Symbol table and startup information
    10    IMAGE_DATA_DIRECTORY    MetaData;        
    11    DWORD                   Flags;           
    12// DDBLD - Added next section to replace following lin
    13// DDBLD - Still verifying, since not in NT SDK
    14//    DWORD                   EntryPointToken;
    15  
    16    // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is not set, EntryPointToken represents a managed entrypoint.
    17    // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is set, EntryPointRVA represents an RVA to a native entrypoint.
    18    union {
    19        DWORD               EntryPointToken;
    20        DWORD               EntryPointRVA;
    21    }
    ;
    22// DDBLD - End of Added Area
    23    
    24    // Binding information
    25    IMAGE_DATA_DIRECTORY    Resources;
    26    IMAGE_DATA_DIRECTORY    StrongNameSignature;
    27
    28    // Regular fixup and binding information
    29    IMAGE_DATA_DIRECTORY    CodeManagerTable;
    30    IMAGE_DATA_DIRECTORY    VTableFixups;
    31    IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;
    32
    33    // Precompiled image info (internal use only - set to zero)
    34    IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
    35    
    36}
     IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;

    元数据:元数据是一个二进制数据块,它由几个表构成,他们可以分为三个类别:定义表(definition table ),引用表(references

    table)以及清单表(manifest table).
    常见定义表有:ModuleDef,TypeDef,MethodDef,FieldDef,ParamDef,PropertyDef,EventDef.

    常见的引用表:
    AssemblyRef,ModuleRef,TypeRef,MemberRef.

    清单元数据表:
    AssemblyDef,FileDef,ManifestResourceDef,ExportedTypesDef.

    查看元数据的工具:ILDasm.exe(Intermediate Language Disassembler)

    程序集:是一个或者多个类型定义文件及资源文件的集合。清单是一系列元数据表的集合,他们主要包含作为程序集一部分的那些文

    件的名称。此外,他们还描述了程序集的版本、语言文化、发布者、公共导入的类型以及构成程序集的所有文件。

    CLR操作的是程序集。即它总是先加载包含“清单”的元数据表文件,然后使用该文件来获取其他程序集中的其他文件的名称。

    正是由于清单的存在,程序集的用户才可以不必关心程序的划分细节,使程序集具有了自我描述性(self-describing).

    版本号:如2.5.719.2。2.5表示公众对一个版本号的理解,表示为2.5版本的程序集。第三个编号(719)代表程序集的生成编号,最后

    一个编号(2)表示修订号。

    CLR支持两种程序集:强命名程序集(strongly named assembly)和弱程序集(weakly named assembly).二者真正的区别在于:强命名

    程序集使用发布者的公钥/私钥对来进行签名,它唯一的标识了程序集的发布者。程序集支持两种部署,私有部署和公有部署。弱程

    序集只支持私有部署,强命名程序集即支持私有也支持共有。

    全局程序集缓存(Global Assembly Cache ,GAC):位于..\windows\Assembly。工具为:GACCUtil.exe,使用它可以用来卸载或者加载

    程序集.它的作用是保持强命名程序集与一个子目录的联系,CLR有一个内部函数,可以获取程序集的名称、版本号、语言文化和公钥

    标记。然后这个函数返回一个子目录的路径,其中包含指定程序集的文件。GAC允许多应用程序共享程序集而不出错,防止Dll Hell

  • 相关阅读:
    2013第51周四开放杂记
    2013第51周三杂记
    2013第51周二eclipse启动优化
    2013 第51周一纠错
    2013第50周日小结
    国内主流开放平台接口了解
    手机加密那点事儿_数值内存加密
    crontab,想说爱你不easy
    SIP基本呼叫
    js正則表達式语法
  • 原文地址:https://www.cnblogs.com/hanchan/p/1091802.html
Copyright © 2020-2023  润新知