程序集的含义

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

相当于你定义了一个项目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 Linker即AL.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 将向ManifestResourceDef和FileDef清单表中添加一条目,使其指向一个单独的资源文件。

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

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

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

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

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

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

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

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

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

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

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

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

3、AssemblyVersion:该版本号存储在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 Utility即SN.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确知的地方。强命名程序集既可以进行私有部署,也可以进行全局部署。

4.System.Reflection.AssemblyName类:

利用它,我们可以很容易地创建一个程序集名称,并获取一个程序集名称的各个部分。公有实例属性:如CultureInfo、FullName、KeyPair、Name以及Version.该类提供了几个公有实例方法,如GetPublicKey、GetPublicKeyToken、SetPublicKey、以及SetPublicKeyToken。

八、其他

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

为使我们创建的C#程序集出现在.NET选项卡的列表中,可以将下面的子键添加到注册表中:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\

C#编程(八十三)---------- 程序集的含义的更多相关文章

  1. C#高级编程八十三天----程序集的含义

    程序集的含义 一.程序集是包括一个或多个类型定义文件和资源文件的集合.它同意我们分析可重用类型的逻辑表示和物理表示. 相当于你定义了一个项目XXProject,项目存在非常多文件(类,窗口,接口,资源 ...

  2. 不为人知的网络编程(八):从数据传输层深度解密HTTP

    1.引言 在文章<理论联系实际:Wireshark抓包分析TCP 3次握手.4次挥手过程>中,我们学会了用wireshark来分析TCP的“三次握手,四次挥手”,非常好用.这就是传说中的锤 ...

  3. 孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境

    孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境 (完整学习过程屏幕记录视频地址在文末) 学习Python我肯定不会错过图片文字的识别,当然更重要的是简单的验证码识别了,今天 ...

  4. 转: ES6异步编程: co函数库的含义与用法

    转: ES6异步编程: co函数库的含义与用法 co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行. 比如,有一个 Ge ...

  5. “全栈2019”Java第八十三章:内部类与接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. 《手把手教你》系列基础篇(八十三)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-下篇(详解教程)

    1.简介 其实前边好像简单的提到过测试报告,宏哥觉得这部分比较重要,就着重讲解和介绍一下.报告是任何测试执行中最重要的部分,因为它可以帮助用户了解测试执行的结果.失败点和失败原因.另一方面,日志记录对 ...

  7. 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  9. Linux 网络编程八(epoll应用--大并发处理)

    //头文件 pub.h #ifndef _vsucess #define _vsucess #ifdef __cplusplus extern "C" { #endif //服务器 ...

随机推荐

  1. Mac配置Java开发环境

    笔者从Window上转到Mac上做开发,一切配置都要重新开始,开发环境配置介绍如下: 1. 下载JDK 从下面链接选择合适版本的安装包进行下载...笔者下载的是jdk-9.0.1 链接:http:// ...

  2. keras + tensorflow安装

    先安装anaconda 一条指令:conda install keras 就可以把keras,tensorflow装好.

  3. java多线程快速入门(九)

    多线程安全问题(卖火车票案例) package com.cppdy; class MyThread5 implements Runnable{ private Integer ticketCount= ...

  4. hdu6153 poj3336强化版kmp+线性dp

    发现很早以前用exkmp做过一次,但是对这题来说只要将两个串翻转一下即可转换成s2的所有前缀出现的问题 /* 给出s1,s2,求s2的每个后缀在s1中出现的次数 ans = sum{后缀长度*出现次数 ...

  5. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  6. 性能测试十五:liunx下搭建(tomcat+项目+jmete命令行)

    单机 准备工作: 1.压力机安装并配置好JDK,输入java和javac验证环境变量 2.上传jmeter到liunx下: 准备好jmeter的压缩包 在第三方工具中对linux文件上传下载(需先装好 ...

  7. 关于ie7下display:inline-block;不支持的解决方案。

    摘要: 声明:此文章为转载(点击查看原文),如有侵权24小时内删除.联系QQ:1522025433. 今天码的时候遇到这个问题了. 如果本身是内联元素的,把它的display属性设置设置为inline ...

  8. Map集合遍历的四种方式理解和简单使用

    ~Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1:无非就是通过map.keySet()获取到值,然后根据键获取到值 for(String s:m ...

  9. Struts2的动态Action和全局跳转视图以及配置各项默认值

    1:Struts2的默认访问后缀是.action(特别需要注意的是改了配置文件web.xml或者struts.xml需要重启服务器) 2:Struts2中常用的常量介绍:<!-- 一:全局配置 ...

  10. mongo3.x配置说明

    Mongodb 3.x配置说明,本文内容忽略了Enterprise版和一些不常用的配置. 一.配置说明 在Mongod安装包中,包含2个进程启动文件:mongod和mongos:其中mongd是核心基 ...