首页 > 编程语言 >C#教程 - 程序集(Assembly)

C#教程 - 程序集(Assembly)

时间:2022-09-21 08:46:34浏览次数:92  
标签:文件 教程 Assembly C# 程序 dll 命名 NET

更新记录
转载请注明出处:
2022年9月21日 发布。
2022年9月10日 从笔记迁移到博客。

程序集(Assembly)说明

运行在CLR上的版本化的、自描述的二进制文件

An assembly may be static (based on a file) or dynamic (created in memory)

程序集作用

代码可以放在多个程序集中实现代码重用

限定代码的作用范围(程序集.命名空间.类型名)

程序集具有版本,可以实现代码版本化管理

程序集是自描述的

程序集是可配置的,私有或公有,都可以使用XML文件

程序集文件表现

程序集外在表现可以分为:application(应用)、library(类库)

它们的区别在于:application包含mian方法,而library不包含

library常用于被applicaiton或其他library调用

目标类型:

/Target:exe
/Target:winexe
/Target:library
/Target:module

程序集的外在文件扩展名表现:

.dll
.exe

注意:程序集是一个逻辑概念,可以跨越多个物理文件

.NET Framework程序集存放位置

%SystemRoot%\Assembly

程序集结构组成

说明

程序集不包含本地机器代码,而是包含:

中间语言代码(IL code、Type metadata)

即时编译器(JIT)

将CIL转为本地代码的一切,比如:引用其他程序集的引用(Assembly metadata and manifest)

Embedded Resources (optional): Images, strings, JavaScript, and so on

结构组成

Windows文件首部

​ 作用:可以让windows操作系统加载程序集

CLR文件首部

清单

​ 程序集标识(如:名称,版本,文化信息,公钥)

​ 组成程序集的文件列表

​ 引用其他程序集信息

​ 类型的程序集位置索引

CIL

​ 中间代码

元数据

​ 类型说明信息

资源

​ 资源是可选的

示意图:
image

多文件程序集结构

大部分程序集由单文件组成,但也有多个文件的

程序集的代码文件称为模块, 对于有多个模块的程序集,一个文件是主模块(primary module),其他文件是次要模块(secondary modules)

主模块包含有程序集的清单和到次要模块的引用

次要模块文件名以.netmodule结尾

多文件程序集被视为单一单元,需要一起部署并一起定版本
image

metadata(元数据)

The metadata includes the following items:

A description of each type within a program or class library

The manifest information containing data about the program itself,along with the libraries it depends on

Custom attributes embedded in the code, providing additional information about the constructs the attributes decorate

引用其他程序集(Reference Assembly)

Visual Studio操作步骤

添加项目引用
image

在代码中添加using可以减少写命名空间的次数(可选)

编译过程示意图

image

友好程序集(Friend Assemblies)

可以将一个程序集标记为自己的友好程序集

实例:使用特性即可

[assembly: InternalsVisibleTo ("FriendName")]

实例:friend assembly has a strong name

[assembly: InternalsVisibleTo("StrongFriendName, PublicKey=0024f000048c...")]

实例:提取当前程序集的公钥

string key = string.Join ("",
 Assembly.GetExecutingAssembly().GetName().GetPublicKey()
 .Select (b => b.ToString ("x2")));

mscorelib.dll

程序集mscorelib.dll包含C#基本类型和大部分.NET语言基本类型的定义

在编译C#程序时,它总是被引用,所以它并不会显示在References中
image

CoreLib.dll

类似.NET Framework中的mscorelib.dll程序集

大部分.NET Core基本的基本类型都放在System.Private.CoreLib.dll程序集中

System.Private.CoreLib.dll 约等于 .NET Framework中的 mscorlib.dll

包括内置类型以及基本的集合类,以及流处理、序列化、反射、线程和本机互操作性的类型

注意:System.Private.CoreLib.dll 已经代替了 .NET Framework中的 mscorlib.dll

命名冲突问题

当引入两个程序集类库,而这两个程序类库中同时都声明了一个相同的类型,会产生命名冲突问题
image

解决的办法就是使用命名空间:
image

程序集标识符

在.NET中,程序集的文件名不像其他操作系统中那么重要,更重要的是程序集的标识符(identity)

程序集标识符组成:

​ 简单名:就是程序集文件的文件名(不带扩展名)

​ 版本号:4个句点分开的整数字符串组成,MajorVersion.MinorVersion.Bulid.Revision

​ 文化信息:一个字符串(2~5个字符),代表一个语言或地区,比如每个en-US

​ 公钥:128字节字符串,表示这是一个独一无二的程序集

清单中程序集标识符的组成图示
image

完全限定名称概念:
image

强命名程序集

说明

强命名(strong named)程序集有一个唯一的数字签名,强命名程序集比没有强命名的程序集更加安全
image

使用visual studio生成强命名程序集

进入项目属性页
image

为程序集添加签名
image

使用Strong Name(sn.exe)

Strong Name工具是个命令行工具,允许手动为程序集签名,比使用Visual Studio签名更加高级拥有更多选项

首先先用sn工具生成一对秘钥:sn -k 秘钥名.snk
image

然后在程序集的属性文件中添加KeyFile

注意:一定要添加版本号,版本号也是秘钥的一部分
image

设置程序集的信息

方法一:项目属性窗口中的程序集信息设置

image

方法二:AssemblyInfo.cs文件

image

程序集部署

私有方式部署

直接复制程序集文件到目标机器即可,也称为复制文件(XCopy)部署

提示:

私有程序集的所在的目录被称为应用程序目录

私有程序集可以是强命名的也可以是弱命名的

不需要再注册表中注册组件

卸载一个私有程序集直接删除程序集的文件即可

共享程序集和GAC

将程序集放在全局程序缓存(GAC)目录下,所有.NET程序都可以使用

这种程序集叫做共享程序集

只有强命名的程序集支持添加到GAC

.NET4.0版本之后的GAC目录:C:\Windows\Microsoft.NET\assembly

.NET4.0版本之前的GAC目录:C:\Windows\assembly

注意:只有.dll文件才能部署为共享程序集

把程序集安装到GAC的办法:

​ 首先程序集必须是强命名的(在安装时进行检查,使用时不检查)

​ 使用gacutil.exe从GAC添加或删除程序集

image

进入待安装的程序集目录,然后执行安装命令
image

卸载只是命令参数换一下
image

标签:文件,教程,Assembly,C#,程序,dll,命名,NET
From: https://www.cnblogs.com/cqpanda/p/16712658.html

相关文章

  • Codeforces 821 Div2
    T1:大小为n的数组,最多进行k次操作:下标模k意义下相等则可进行交换。求操作后连续k个元素的最大值固定最大值的k个连续因素小标为[0,k),现在只需使得它为最大即可,将可交换位......
  • C#教程 - 命名空间(Namespace)
    更新记录转载请注明出处:2022年9月21日发布。2022年9月10日从笔记迁移到博客。命名空间(Namespace)说明一串字符串,解决代码标识符命名重复问题作用:减少命名冲突、增......
  • 实验2:Open vSwitch虚拟交换机实践
    (一)基本要求a)/home/用户名/学号/lab2/目录下执行ovs-vsctlshow命令、以及p0和p1连通性测试的执行结果截图;b)/home/用户名/学号/lab2/目录下开启MininetCLI并执行pi......
  • CF 821
    B:n个人比赛,比赛规则,1,2比赛,胜者与3比赛,再胜者与4比赛,一次类推,最后得到冠军。故必定进行n-1次比赛,游戏结束。现在给定x,y,表示对于其中任何一个人,此人赢了x场或输了y场,问......
  • dotnet 为大型应用接入 ApplicationStartupManager 启动流程框架
    对于大型的应用软件,特别是客户端应用软件,应用启动过程中,需要执行大量的逻辑,包括各个模块的初始化和注册等等逻辑。大型应用软件的启动过程都是非常复杂的,而客户端应用软件......
  • CSS 网格 Gird 布局
    CSS网格Gird布局创建网格Gird通过将属性display的值设为grid,HTML元素就可以变为网格容器。注意:在CSS网格中,父元素称为容器(container),它的子元素称为项(items)。......
  • ES6对Number数字以及Object对象类型做的升级优化
    1.ES6对Number数字做的升级优化优化部分ES6在Number原型上新增了isFinite()、isNaN()方法,用来取代ES5中的isFinite()、isNaN()方法检测数值是否有限,是否是NaN。//ES5c......
  • css-flexbox
    在缩放整个页面的时候,里面的元素可以随着页面缩放而变化设置display属性为flex就可以了display:flex;  决定容器中的主轴方向用flex-directionex:flex-direction......
  • [Note]CF 题乱做
    CF161CAbracadabra*2400.分治,每次有\(4\)种情况:左左,左右,右右,右左(相对于当前对称轴)。复杂度看似是\(O(n^2)\)的,但是我们可以用以个剪枝将其优化到\(O(\logn)\):如......
  • PyQt完整入门教程
    PyQt完整入门教程https://blog.csdn.net/baidu_37503452?spm=1000.2115.3001.53431、GUI开发框架简介19年来,一直在做AndroidROM相关测试,也有了一定的积累;20年......