C#教程 - 程序集(Assembly)
更新记录
转载请注明出处:
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
中间代码
元数据
类型说明信息
资源
资源是可选的
多文件程序集结构#
大部分程序集由单文件组成,但也有多个文件的
程序集的代码文件称为模块, 对于有多个模块的程序集,一个文件是主模块(primary module),其他文件是次要模块(secondary modules)
主模块包含有程序集的清单和到次要模块的引用
次要模块文件名以.netmodule结尾
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操作步骤#
在代码中添加using可以减少写命名空间的次数(可选)
编译过程示意图#
友好程序集(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中
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
命名冲突问题#
当引入两个程序集类库,而这两个程序类库中同时都声明了一个相同的类型,会产生命名冲突问题
程序集标识符#
在.NET中,程序集的文件名不像其他操作系统中那么重要,更重要的是程序集的标识符(identity)
程序集标识符组成:
简单名:就是程序集文件的文件名(不带扩展名)
版本号:4个句点分开的整数字符串组成,MajorVersion.MinorVersion.Bulid.Revision
文化信息:一个字符串(2~5个字符),代表一个语言或地区,比如每个en-US
公钥:128字节字符串,表示这是一个独一无二的程序集
强命名程序集#
说明#
强命名(strong named)程序集有一个唯一的数字签名,强命名程序集比没有强命名的程序集更加安全
使用visual studio生成强命名程序集#
使用Strong Name(sn.exe)#
Strong Name工具是个命令行工具,允许手动为程序集签名,比使用Visual Studio签名更加高级拥有更多选项
然后在程序集的属性文件中添加KeyFile
设置程序集的信息#
方法一:项目属性窗口中的程序集信息设置#
方法二:AssemblyInfo.cs文件#
程序集部署#
私有方式部署#
直接复制程序集文件到目标机器即可,也称为复制文件(XCopy)部署
提示:
私有程序集的所在的目录被称为应用程序目录
私有程序集可以是强命名的也可以是弱命名的
不需要再注册表中注册组件
卸载一个私有程序集直接删除程序集的文件即可
共享程序集和GAC#
将程序集放在全局程序缓存(GAC)目录下,所有.NET程序都可以使用
这种程序集叫做共享程序集
只有强命名的程序集支持添加到GAC
.NET4.0版本之后的GAC目录:C:\Windows\Microsoft.NET\assembly
.NET4.0版本之前的GAC目录:C:\Windows\assembly
注意:只有.dll文件才能部署为共享程序集
把程序集安装到GAC的办法:
首先程序集必须是强命名的(在安装时进行检查,使用时不检查)
使用gacutil.exe从GAC添加或删除程序集
作者:重庆熊猫
出处:https://www.cnblogs.com/cqpanda/p/16712658.html
版权:本作品采用「不论是否商业使用都不允许转载,否则按3元1字进行收取费用」许可协议进行许可。
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16712658.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)