zoukankan      html  css  js  c++  java
  • C#高级编程八十三天----程序集的含义

    程序集的含义

    .程序集是包括一个或多个类型定义文件和资源文件的集合.它同意我们分析可重用类型的逻辑表示和物理表示.

    相当于你定义了一个项目XXProject,项目存在非常多文件(,窗口,接口,资源等等),编译生成一个DLL文件,就是程序集.

    当你使用这个程序集的时候,引用改程序及就能够得到该程序集里面的全部东西(,窗口,接口,资源).

    程序集的特征例如以下:

    1.程序集定义了可重用的类型

    2.程序集标识有一个版本

    3.程序集能够包括与之相关的安全信息

    .使用程序集的原因(也就是使用多文件集的原因):

    1.能够将类型分别实如今不同的文件里,从而同意文件在互联网环境中进行增量下载

    2.能够依照须要向程序集中加入资源或数据文件(数据文件能够是任务格式:文本文件,电子表格,word文档等等)

    3.能够是我们创建的程序集包括一些用不同编程语言实现的类型.

    注意:VS.NET计策后功能开发环境本身不支持创建多文件程序集,假设须要创建多文件程序集,必须求助于命令行工具.

    csc  /t:module Rut.cs           //生成Rut.netmodule文件  

    csc  /out:UnionType.dll  /t:library  /addmodule Rut.netmodule  Fut.cs  

      //生成UnionType.dll类库文件 Run.netmodule文件作为程序集的一部分来对待 

    .程序链接器

    程序链接器:Assembly LinkerAL.exe

    使用前提:

    假设我们要创建的程序集包括来自不同的编译器生成的模块,而使用的编译器又不支持类似于C#中/addmodule那样的命令行开关,或者生成模块时还不知道程序集的打包需求,这时程序集链接器就显示很实用。

    使用实例:

    csc /t:module Rut.cs  

    csc /t:module Fut.cs  

    al /out: UnionType.dll /t:library Fut.netmodule Rut.netmodule  

    .资源文件的加入

    1.使用csc.exe来加入资源文件:

    /resource 将把指定的资源文件嵌入到产生的程序集PE文件里。并更新ManifestResourceDef表中的内容。

    /linkresource 将向ManifestResourceDefFileDef清单表中加入一条目。使其指向一个单独的资源文件。

    2.使用AL.exe来加入资源文件:

    /embed[resource]:该命令行接受不论什么类型的文件,将其内容嵌入到产生的PE文件里。同一时候,清单中的ManifestResourceDef表将被更新以反映该资源的存在。

    /link[resource]:该命令将仅仅更新清单中的ManifestResourceDef表和FileDef表,以反映资源的存在,并标识出程序集的哪个文件包括着资源文件。资源文件本身不会被嵌入到程序集PE文件里,它仍然保持独立。而且须和其他程序一起打包、部署。

    3.将Win32资源嵌入到程序集中:

    通过AL.execsc.exe加入/win32res命令行开关指定一个.res文件路径来实现。

    通过AL.execsc.exe加入/win32icon命令行开关并指定一个.ico文件路径来实现。

    五、C#程序集版本号信息:

    版本由四个部分组成:主版本、次版本、生成版本、修订版本

    例:2.5.719.2 主版本号号与次版本号号组成“面向公众”的版本号部分,第三个版本号号719表示程序集的生成版本号,最后一个版本号号2表示对生成版本号的修订版本号。

    一个程序集的三个相关版本:

    1AssemblyFileVersion: 该版本号号存储在Win32版本号资源中,它不过一个辅助性的信息。

    2AssemblyInformationalVersionAttribute:该版本号号也存储在Win32版本号资源中,仅辅助性作用。

    3AssemblyVersion:该版本存储在AssemblyDef清单元数据表中。

    这个版本很重要,它用来惟一地标识一个程序集。

    六、语言文化:

    不提倡创建包括代码的卫星程序集,但还是有可能做到。假设我们愿意,仍然能够用System.Reflection.AssemblyCultureAttribute定制特性来取代AL.exe/culture命令行开关来指定语言文化。示比例如以下:

    //将程序集的语言文化设置为瑞士德语

    [assembly AssemblyCulture (de-CH)]

    通常情况下,我们创建的程序集不应该引用卫星程序集。也就是一个程序集的AssemblyRef条目指向的都应该是语言文化中性的程序集。假设想訪问一个卫星程序集中的类型或成员,我们应该使用反射技巧。

    卫星程序集:标识着特定语言文件的程序集称为卫星程序集。

    七、共享程序集:

    1.NET框架支持的两种程序集:

    弱命名程序集:Weakly named assembly

    强命名程序集:Strongly named assembly

    二者之间的真正差别在于:强命名程序集有一个公布者的公钥/私钥对签名。当中的公钥/私钥匙对惟一地标识了程序集的公布者。

    强命名集包括四个惟一标识程序集的特性:文件名称(没有扩展名)、版本、语言文化标识和一个公有密钥标识。

    例:”MyTypes,Version=1.0.8123.0,Culture=neutral,PublicKeyToken=b77a5c561934e089

    2.强命名有用工具:

    Strong Name UtilitySN.exe .Net框架SDK。以及Visual studio .Net一起公布的一个工具。

    例:SN k MyCompany.keys

    该命令告诉SN.exe创建一个名为Mycompany.keys的文件。Mycompany.keys文件将包括一对以二进制格式存储的公有密钥和私有密钥。

    查看公有密钥:(必须运行以下两步)

    SN p MyCompany.keys MyCompany.publickey

    SN tp MyCompany.publickey

    创建强命名程序集:

    [assembly: AssemblykeyFile ( MyCompany.keys)]

    3.程序集的两种部署方式:即私有部署方式和全局部署方式

    私有部署方式将程序集部署在应用程序的基文件夹及其子文件夹下,弱命名程序集仅仅能进行私有部署。

    全局部署方式将程序集部署在一些CLR确知的地方。

    强命名程序集既能够进行私有部署。也能够进行全局部署。

    4System.Reflection.AssemblyName类:

    利用它。我们能够非常easy地创建一个程序集名称,并获取一个程序集名称的各个部分。公有实例属性:如CultureInfoFullNameKeyPairName以及Version.该类提供了几个公有实例方法,如GetPublicKeyGetPublicKeyTokenSetPublicKey、以及SetPublicKeyToken

    八、其它

    元数据标识是一个4字节的数值。其高位字节表示标记的类型(0x01 = TypeRef ,0x02 =TypeDef, 0x26 = FileDef , 0x27 = ExportedType

    为使我们创建的C#程序集出如今.NET选项卡的列表中。能够将以下的子键加入到注冊表中:HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFramework

  • 相关阅读:
    STM8s在利用库配置端口的小问题
    ABAP调试
    READ TABLE 的用法
    人在低谷
    力扣 两数之和
    未来选择
    选择
    室友问题该如何解决呢?
    力扣 两数之和
    谈谈自己
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7080678.html
Copyright © 2011-2022 走看看