CLR via C# 读书笔记2-4

《CLR via C#》CLR基础 CLR是公共语言运行库(Common Language Runtime),又叫公共语言运行时。CLR和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境,可由面向CLR的所有语言使用。它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。 .NET框架是一种以CLR为基础、支持多种语言(C#、F#、VB.NET、C++、Python等)的开发的软件... 阅读详情

从模块到程序集

前文的 Program.exe 不仅是一个包含元数据的 PE 文件,也是一个程序集。所谓的程序集是一个或多个包含类型定义或资源的文件的集合。程序集中的一个文件被用来存放 manifest,这个 manifest 是另一个元数据表的集合,其中包含了程序集中所有文件的名称,以及程序集的版本,culture,发布者,公有类型等信息。CLR 处理程序及时,总是首先打开这个程序集中的 manifest 文件,以获取程序集的信息。

以下是程序集的特点:
■ 程序集定义了可重用的类型
■ 程序集有一个版本号
■ 程序集可以关联安全信息

程序集中的文件(除了上文提到的 manifest 文件)都没有以上的特性。通常情况下程序集仅包含一个文件(如前文的 Program.exe),但它实际上可以由多个文件(多个PE 文件以及多个资源文件)组成。
程序集作为一个可重用的单位,你可以把常用和不常用的功能类型进行分隔。以下是使用程序集的场景:
■ 类型分布在多个文件,可以通过网络被增量下载,同样也有利于分开打包发售。
■ 为你的程序集添加资源或数据文件。比如,你有一个计算保险的类型,这个类型需要访问一些表数据。你可以通过使用类似Assembly Linker(AL.exe)的工具把这些表合并到程序集中而不是直接在源代码中包含这些表。这些表可以是任何你的程序能解析的格式: text 文件,Excel 文件,Word 文件等等。
■ 建立不同开发语言的程序。比如,你可以同时使用 C# 或 Visual Basic 或其他语言,并通过它们各自的编译器编译为独立的模块,然后使用工具把这些模块集成到一个程序集中。如果你愿意,你可以使用 ILDasm.exe 打开所有这些模块,并提取 IL 源代码文件,然后使用 ILAsm.exe 把这些源代码文件合成为一个文件。

注意:如果你有多个类型,并属于同一版本同一安全设定,那么为了获得更好的性能,把它们合在一个文件中是比较好的做法。因为载入一个文件/程序集会使 CLR 花费相当的时间去定位程序集,载入并初始化,所以载入的文件/程序集数量越少越好。

要生成一个程序集,你必须选择一个既有的 PE 文件或者新建一个空的 PE 文件来包含 manifest。表 2-3 显示了把托管模块转变为程序集的 manifest 的 元数据表:

表 2-3 Manifest 元数据表

Manifest 元数据表名说明
AssemblyDef包含该模块是否是一个程序集的条目,包含了程序集的名称,版本,culture, 标志, 哈希值以及发布者公钥
FileDef程序集中每个 PE 或资源文件的条目(除了包含manifest的那个文件),它包含了文件名,哈希值,标志。如果程序集仅包含自身一个文件,那么 FileDef 表为空。
ManifestResourceDef程序集中每个资源的条目),它包含了资源名,标志(public,private),以及对应到FileDef 表中数据的索引。
ExportedTypesDef程序集中每个公有类型的条目,包含了类型名称,对应到FileDef 表的索引(指名该类型来自哪个文件),对应到 TypeDef 表的索引。

 

这些 manifest 使得程序集是“自我描述”的,同时明确指定哪些文件是该程序集的组成部分。(但是反过来,这些文件本身并不包含 manifest 来表明它们是程序集的一部分)。

当你在编译命令行上使用: /t[arget]:exe, /t[arget]:winexe, /t[arget]: appcontainerexe, /t[arget]:library, 或 /t[arget]:winmdobj 时,编译器会生成为程序集(包含manifest 元数据表的PE 文件)。除了这些编译开关, C# 编译器还支持 /t[arget]:module 开关,该开关生成一个不包含manifest 元数据表的PE 文件(一个DLL PE文件)。这种文件只有被组入一个程序集后才能被 CLR 解析访问,默认的后缀名为 .netmodule。

注意:Microsoft Visual Studio IDE 并没有内置支持以上的功能,所以你只能通过命令行来完成。
有许多方式来把一个模块组入到一个程序集中,如果你使用 C# 编译器你可以使用 /addmodule 开关。以下是个示例,首先假设你有2个文件:

■ RUT.cs,包含一些不常用的类型
■ FUT.cs,包含了一些常用的类型

先编译 RUT.cs (csc /t:module RUT.cs),这会生成一个名为 RUT.netmodule 的文件。
接着编译 FUT.cs,同时组入RUT.netmodule  (csc /out:MultiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs) 。这最终生成一个名为 MultiFileLibrary.dll 的程序集文件,文件内部结构参见图2-1:

使用 ILDasm.exe 来验证一下:

File #1 (26000001)
-------------------------------------------------------
Token: 0x26000001
Name : RUT.netmodule
HashValue Blob : e6 e6 df 62 2c a1 2c 59 97 65 0f 21 44 10 15 96 f2 7e db c2
Flags : [ContainsMetaData] (00000000)
ExportedType #1 (27000001)
-------------------------------------------------------
Token: 0x27000001
Name: ARarelyUsedType
Implementation token: 0x26000001
TypeDef token: 0x02000002
Flags : [Public] [AutoLayout] [Class] [Sealed] [AnsiClass]
[BeforeFieldInit](00100101)

当其他客户端代码参照 MultiFileLibrary.dll 程序集运行的时候,CLR 首先在程序集中包含 manifest 的那个文件中检索需要的类型,如果能够找到 CLR 会内部登记一下然后使用,如果未检索到,但是通过 manifest 获知在程序集的另一个组成文件中, CLR 会载入这个文件然后内部登记后并使用。如果该程序集中找不到,那么CLR 会查找其他的程序集。这就意味着运行一个程序,并不需要参照程序集中的文件都参与。

《CLR via C#》学习笔记【1】 一、CLR的执行模块1.1 将源代码编译成托管模块 非托管C/C++可对系统进行低级控制,按自己的想法管理内存、VB可以快速生成UI应用程序,并控制COM对象和数据库。 公共语言运行时(Common Language Runtime, CLR)是一个由多种编程语言使用的“运行时”。CLR的核心功能(如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。 事实上在运行 阅读详情

相关推荐

CLR via C#: 4th Edition with Full Table of Contents

CLR是.NET平台的运行时引擎,它负责管理代码的执行,提供了诸如内存管理、线程同步、异常处理等运行时服务。CLR使得.NET支持的编程语言可以在相同的虚拟环境中运行,而与底层操作系统和硬件平台无关。这种特性使得.NET应用程序具有良好的可移植性。.NET类型系统是建立在值类型和引用类型这两个概念上的。值类型直接存储数据,而引用类型存储对数据(对象)的引用。理解这两种类型的区别及其转换是管理内存和编写高效代码的关键。.NET 允许开发者创建自定义异常类,这些类通常继承自类。

weixin_35257663的博客 924

程序集

一、程序集的一些基本概念:程序集是包含一个或多个类型定义文件和资源文件的集合。它允许我们分离可重用类型的逻辑表示和物理表示。程序集是一个可重用、可实施版本策略和安全策略的单元。它允许我们将类型和资源划分到不同的文件中,这样程序集的使用者便可以决定将哪些文件打包在一起部署。一旦CLR加载了程序集中包含清单的那个文件,它就可以确定程序集的其他文件中哪些包含了程序正在引用的类型和资源。任何程序集

guxianga 690

《CLR via C# 第四版》配套示例源码深入分析

NET类型系统允许开发者使用两种类型的对象:引用类型和值类型。引用类型存储在堆上,而值类型存储在栈上或作为结构体的成员存储在堆上。引用类型包括类、接口、委托、数组等;值类型包括基本数据类型、枚举以及结构体。.NET允许开发者创建自己的异常类型,以便更加具体地表示应用程序中可能发生的特定错误。自定义异常通常继承自类或其子类。创建自定义异常时,推荐在构造函数中使用来调用基类的构造函数,以便提供有用的错误信息。

weixin_35752122的博客 1073

CLR via C# 读书笔记2-4 追记

使用程序集连接器 (Assembly Linker) 除了使用 C# 编译器,你也可以使用 Assembly Linker 工具(AL.exe)来作成包含多个模块(这些模块可以是不同开发语言编译器编译的产物)的程序集。通过这种方法能够生成纯资源程序集 (术名: satellite assemblies),专门用来对应本地化。再次拿前文生成MultiFileLibrary.dll的例子来说明,这次

sqlchen的专栏 804

CLR via C#(第3版)中英文双语带书签及源码完整版

CLR(Common Language Runtime)是.NET程序的执行引擎,负责管理代码的加载、编译、执行与资源回收。其核心组件包括JIT编译器、垃圾回收器(GC)、类型系统、异常处理机制和安全引擎,共同构成托管执行环境。// 示例:一个简单的托管程序入口");该代码在运行时由CLR完成程序集加载 → JIT编译 → 托管执行 → 内存自动管理的全生命周期控制,体现其对开发者透明但底层高度可控的特性。场景推荐做法频繁创建大数组改用复用缓冲区。

weixin_33608403的博客 914

​​EMC设计实战:BCI(大电流注入)硬件设计规范

LIN接口:集成TVS管(如PESD5V0S1BL)与共模电感,耐压等级≥20V(8kV HBM)。输入滤波:10μF电解电容(100kHz截止)+ 0.1μF陶瓷电容(10MHz截止)。​:全频段(1MHz-400MHz)注入200mA电流,LIN通信误码率<0.01%。对敏感电路(如传感器)采用隔离电源(如ADuM5000),隔离电压≥3kVrms。​:连续波(CW)与调幅波(AM,调制深度80%)组合,覆盖全频段干扰场景。​:选择低频段(1-100MHz)感量≥100μH的绕线电感,抑制共模电流。

m0_50833886的博客 1929

CLR via C# 读书笔记 4-2 线程和锁的一些使用原则

1.如果可以,尽可能使用线程池中的线程, 因为自己创建,维护销毁一个线程会极大的消耗CPU和内存资源,如果需要定时工作,那么请使用System.Threading.Timer 2.在读多写少的情况,使用读写锁ReaderWriterLockSlim (不要使用ReaderWriterLock), 因为这样读操作之间不会互斥 3.尽量不要使用递归的锁 ,当然Moniter是个例外,他虽然使用了递...

weixin_30925411的博客 111

从零理解Brep:用Python玩转3D建模的边界表示法(附OpenCASCADE示例)

本文深入解析了边界表示法(Brep)在3D建模中的应用,通过Python和OpenCASCADE的实战示例,详细介绍了Brep的核心数据结构、布尔运算、网格转换及3D打印优化技巧。适合CAD设计、3D打印和计算机图形学领域的开发者学习与实践。

n4o5p6q7r的博客 425

CLR via C# 3 读书笔记(12):第2章 生成、打包、部署和管理应用程序与类型 — 2.4 将模块组合为程序集(上)...

上一篇随笔中讨论的Program.exe不仅仅是一个包含元数据的PE文件,它还是一个程序集。程序集是一个或多个包含类型定义的文件和资源文件的集合。程序集的某个文件用来保存清单(manifest)。清单是另外一组元数据表的集合,主要包含了程序集中一部分文件的名称。这些元数据表还描述了程序集的版本、语言文化、发布者、公有导出类型和组成程序集的所有文件。 CLR操作程序集,也就是说,CLR总是先加载包...

weixin_33807284的博客 147

2025年12月11日 Coherent收发器下沉到数据中心:调研

技术可行性已基本具备。随着3nm DSP技术的成熟和Coherent-Lite等低功耗方案的推出,Coherent技术与IMDD的功耗差距在800G及以上速率节点快速缩小。特别是在1.6T及更高速率,两种技术的功耗开始趋于收敛。同时,通过系统级优化,如将DSP功能从可插拔模块转移到ASIC芯片,可实现30%以上的功耗降低。在成本方面,硅光技术的进步使得单通道硅光引擎BOM成本降至18美元,较2020年下降62%,逼近InP方案的经济临界点。光学系统机会丰富多样。

weixin_51184047的博客 1167

QCC305x-QCC304x系列开发教程之应用程序子系统详解 嵌入式

本文对QCC305x-QCC304x系列芯片的应用程序子系统进行了详细解析,并给出了一个LED闪烁的示例代码。嵌入式系统的开发既需要理论知识的支持,也需要实践经验的积累,希望本文能够为读者在QCC305x-QCC304x系列芯片的开发中提供一些有益的指导。QCC305x-QCC304x系列芯片提供了丰富的外设接口,包括UART、SPI、I2C等,开发者可以根据需求选择适合的接口进行数据传输和控制。QCC305x-QCC304x系列芯片的应用程序子系统是整个嵌入式系统的核心部分,负责管理和执行各种应用程序。

CodeMaven的博客 224

CLR via C# 3 读书笔记(13):第2章 生成、打包、部署和管理应用程序与类型 — 2.4 将模块组合为程序集(下)...

使用Visual Studio IDE为项目添加程序集引用 如果你使用Visual Studio IDE来创建项目,就必须为项目添加所引用的程序集。打开Solution Explorer,右键点项目,然后选择Add Reference,打开Add Reference对话框: 在列表中选择想要的程序集进行引用。如果程序集不在列表中,点击Browse选项卡,找到所需的程序集(包含清单的文件)...

weixin_30249203的博客 126

芯片ATE测试PAT(Part Average Testing)学习总结-20250916

文章摘要:零件平均测试(PAT)是半导体制造中基于统计学的质量控制方法,分为静态和动态两种类型。静态PAT通过预先设定的固定限值(每6-8批次更新)筛选异常芯片,计算采用稳健平均值和四分位间距。动态PAT则根据实时数据调整限值,能更精确识别异常而不误判合格芯片。两种方法均采用"均值±6倍标准差"的计算公式,但动态PAT具有更好的适应性和准确性。该方法通过统计分析提高了芯片产品的质量和可靠性。

歌颂苦难的行为是无耻的; 1189

【亲测免费】 深入探索.NET CLR:《CLR via C》第4版资源推荐

深入探索.NET CLR:《CLR via C#》第4版资源推荐 【下载地址】CLRviaC第4版中英文版资源下载 - **书名**: CLR via C# 第4版- **语言**: 中文版 & 英文版- **格式**: PDF- **特点**: 高清无水印 ...

gitblog_09724的博客 786

基于 ESP32 的宿舍洗浴热水余量预测与智能排队提醒系统设计与实现

本系统以 ESP32 为主控核心,通过超声波液位传感器实时监测储热水箱剩余水量,配合 DS18B20 温度传感器采集水温数据,建立热水余量预测模型估算可用洗浴时长;同时通过红外人体传感器统计浴室排队人数,结合人均洗浴时长计算预计等待时间,并通过 OLED 屏本地显示 + WiFi Web 服务器远程推送的方式实现排队提醒功能。

weixin_42300449的博客 45

南京理工大学计算机预推免面试(双非重点关注)

南京理工大学总体来说对双非学校比较友好,上岸率比较高,而且面试形式是线上,在预推免的过程中,可以作为重点关注的学校,但是一定要注意南理报名截止的时间,部分学校可能保研名额公示的比较晚,对于保研边缘人来说很可能会错过,我的建议是,即使不确定能否拿到保研名额,先查一下截止时间,先在系统上报名!!一旦拿到了offer,就是铁的,保底专硕,而且有很大的技巧性,一定要认真看哈!!!每个人的情况可能都不一样,如果有需要帮忙可以私我~~~

D1379951481的博客 2017

CLR基础之一---认识CLR [《CLR via C#》读书笔记]

《CLR via C#》读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称。这是通用语言架构(简称CLI)的微软实现版本,它定义了一个代码运行的环境。CLR运行一种称为“通用中间语言”的字节码,这个是微软的通用中间语言实现版本。 CLR运行在微软的视窗操作系统上...

weixin_30872499的博客 2241

标准论文参考文献添加方法——Zotero入门使用教程

第一篇论文投出去了,写一下最后一步的参考文献修饰润色吧! 论文的参考文献,即References,是论文的最后一步,相信不管是写毕设论文还是期刊论文都遇到过需要修改参考文献的情况,非常之麻烦。而且参考文献中经常会与生僻奇怪气体出现,一个一个修改非常浪费时间,这里介绍一下一个非常好用的软件Zetero。 第一步:软件的下载安装及绑定Word 尽量使用客户端吧,

MISAYAONE的博客 20万+

CLR via C 第4版 PDF资源介绍

CLR via C# 第4版 PDF资源介绍 【下载地址】CLRviaC第4版PDF资源介绍 《CLR via C#》第4版PDF资源为您提供了深入.NET平台底层架构和C#语言高级特性的详尽指南。本书共计700多页,涵盖CLR核心概念,如内存管理、异常处理、垃圾回收机制、类型系统及程序集加载与执行等。通过学习,您将更深...

gitblog_06727的博客 569

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《CLR Via C#》第一章

大致介绍了CLR执行应用程序的流程,编译代码流程,介绍了IL、元数据和程序集的关系。

weixin_51374560的博客 964

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

《CLR Via C#》第二章

解释如何生成仅供自己的应用程序使用的程序集

weixin_51374560的博客 613

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CLR via C# 第一章—第十三章

方法、构造函数、索引器或委托的定义可以指定其形参为必需还是可选。任何调用都必须为所有必需的形参提供实参,但可以为可选的形参省略实参。每个可选形参都有一个默认值作为其定义的一部分。如果没有为该形参发送实参,则使用默认值。

2301_79124729的博客 1198

【免费下载】 CLR via C 第4版(中英文版) 资源下载

CLR via C# 第4版(中英文版) 资源下载 【下载地址】CLRviaC第4版中英文版资源下载 - **书名**: CLR via C# 第4版- **语言**: 中文版 & 英文版- **格式**: PDF- **特点**: 高清无水印 ...

gitblog_09733的博客 1294

CLR via C 第四版示例源码

CLR via C# 第四版示例源码 【下载地址】CLRviaC第四版示例源码 探索.NET底层奥秘,深入理解C#与CLR的交互机制!《CLR via C# 第四版》示例源码为您提供了书中所有关键概念的实践代码,帮助您将理论知识转化为实际技能。源码按章节组织,涵盖公共类库和解决方案文件,方便您快速上手。只需配置好.NET...

gitblog_06773的博客 379
上一篇: CLR via C# 读书笔记2-3
下一篇: CLR via C# 读书笔记2-4 追记
sqlchen
博客等级 码龄24年 10粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值