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 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类:
利用它。我们能够非常easy地创建一个程序集名称,并获取一个程序集名称的各个部分。公有实例属性:如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#高级编程八十三天----程序集的含义的更多相关文章
- C#编程(八十三)---------- 程序集的含义
程序集的含义 一.程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分析可重用类型的逻辑表示和物理表示. 相当于你定义了一个项目XXProject,项目存在很多文件(类,窗体,接口,资源等 ...
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- Unix环境高级编程(八)进程关系
本章看后给人似懂非懂的感觉,主要是不知道实际当中如何去使用.通过前面几章的学习,每个进程都有一个父进程,当子进程终止时,父进程得到通知并取得子进程的退出状态.先将本章基本的知识点总结如下,日后再看时候 ...
- 【读书笔记】C#高级编程 第十三章 异步编程
(一)异步编程的重要性 使用异步编程,方法调用是在后台运行(通常在线程或任务的帮助下),并不会阻塞调用线程.有3中不同的异步编程模式:异步模式.基于事件的异步模式和新增加的基于任务的异步模式(TAP, ...
- C#高级编程八十二天----用户自己定义异常类
用户自己定义异常类 前面已经说了不少关于异常的问题了,如今来给大家说一下自己定义异常时咋个回事以及咋样. 为啥会出现自己定义异常类呢? 用用脚趾头想想也明确,是为了定义咱们自己的异常,自己定义异常 ...
- C#高级编程八十一天----捕获异常
捕获异常 前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描写叙述一下异常的捕获和处理. 案例代码: using System; using System.Co ...
- (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (八) 一起学 Unix 环境高级编程 (APUE) 之 信号
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- 【读书笔记】C#高级编程 第十九章 程序集
(一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...
随机推荐
- springAOP注解方式实现日志操作
通过自定义注解调用方法执行日志存储: package com.zktx.platform.log2; import java.lang.reflect.Method; import java.util ...
- 使用ssh和putty操控远程的linux server
windows下没有openssh,今天这里使用openssh-server作为server,windows下使用putty作为client, putty主要流程分以下几步: step 1: 下载pu ...
- php和nodejs
整个故事正如好莱坞大片的经典剧情走向:两位昔日好友如今分道扬镳,甚至被迫陷入了你死我活的斗争当中.刚开始的分歧并不严重,无非是一位老友对于另一位伙伴长久以来占据.但又绝口不提的业务领域产生了点兴趣.而 ...
- .NET前后台-JS获取/设置iframe内对象元素并进行数据处理
转载请注明出处:果冻栋吖 这个主要是修改H3BPM一个批量审批的功能时候做的.先看下图: H3自带了批量审批的功能,也就是按钮1,有审批意见3,但是如果3里边不填写内容点击1之后,效果就是表单里边没有 ...
- Python3没有dict.has_key方法
最近开始学习Python,安装上最新的Python3.3.3照书敲了一个小程序结果报错 'dict' object has no attribute 'has_key' 上网查也找不到解决办法,后来发 ...
- 由于找不到 opencv_world320.dll,无法继续执行代码
首先找到自己软件安装(解压)的路径openCV (安装(解压)目录\opencv\build\x64\vc14\bin) 我的安装(解压)目录是:F:\OpenCV\Three320\opencv\b ...
- 破解VIP会员视频集合
浏览器安装暴力猴扩展即可使用 // ==UserScript== // @name 破解VIP会员视频集合 // @namespace https://greasyfork.org/zh-CN/use ...
- Py基础+中级
原文 Py学习博客 1:https://www.cnblogs.com/fu-yong/p/8060198.html2:while True:just do it 三.Python的默认编码 ▷pyt ...
- 【技术累积】【点】【java】【3】编译和反编译
闲聊 擦,打脸了,但打完了还是得继续写呗,水着水着看呗. 概述 理解的不深入,但是实用. 总而言之:编译,是将书写的代码翻译为机器能够理解的代码:反编译,则是相反的过程. 来源在于语言的等级,一般认为 ...
- 工欲善其事必先利其器之windows篇
Windows是我们最常用的系统,下面就让我们重新认识一下Windows有哪些可以让我们提高工作效率的快捷键以及部分技巧,,以及在外行看来可以看起来逼格高的技巧! 1.Windows最实用,最常用的快 ...