CLR via C# 读书笔记2-3

c#反射整理一:API 仅作为个人整理,防止他人博客关闭导致收藏的页面drop掉 反射介绍 http://www.cnblogs.com/guowenhui/archive/2011/12/18/2291552.html 在程序中,当我们需要动态的去加载程序集的时候(将对程序集的引用由编译时推移到运行时),反射是一种很好的选择。反射为.NET类型提供了高度的动态能力,包括:元数据的动态查询、绑定与执行、动态代码生... 阅读详情

初识元数据(Metadata)

前文已经介绍过,编译后生成的托管文件包含4 部分内容:PE32(+) 头,CLR 头,元数据以及 IL 代码。

metadata 是一块包含若干个表的二进制数据,这些标分为3 种类别: 定义表(definition tables), 参照表(reference tables) 以及 manifest 表。表 2-1 列出了一些常见的定义表:

表2-1 常见定义元数据表

元数据

定义表名

说明
ModuleDef总是包含一个标示模块的条目,它包含模块的文件名,文件名后缀,模块版本id。
TypeDef模块中定义的每个类型的条目,它包含了类型名称,父类型,一些标志位 (public, private, 等等) 以及在MethodDef 表中对应方法的索引号,在FieldDef 表中对应字段的索引号,在PropertyDef 表中对应属性的索引号,在EventDef 表中对应事件的索引号。
MethodDef模块中每个方法的条目,它包含方法名,一些标志位 (private, public, virtual, abstract, static,
final, 等等), 签名, 以及对应 IL 代码的偏移量。另外它还能参照到 ParamDef 表中对应的条目。
FieldDef模块中每个字段的条目,它包含字段名,类型,一些标志位 (private, public, 等等)
ParamDef模块中每个参数的条目,它包含参数名,类型,一些标志位 (in, out, retval, 等等)
PropertyDef模块中每个属性的条目,它包含属性名,类型,一些标志位
EventDef模块中每个事件的条目,它包含事件名,类型,一些标志位

 

编译器同时也检测源代码参照到的类型,并建立参照表,图 2-2 列出了一些常见的:

表 2-2 常见参照元数据表
元数据参照表名说明
AssemblyRef模块中每个参照程序集的条目,包含了程序集的名称(不含路径,后缀名),版本号,culture 以及公钥令牌 (通常是从公钥生成的一小组哈希值)。另外他还包含了一些标志位和一个哈希值,这个哈希值是这个参照程序集的校验码,CLR 目前不使用这个哈希值,以后可能会用。
ModuleRef模块中每个参照模块的条目,包含了模块文件名及后缀名(不含路径)
TypeRef模块中每个参照类型的条目,包含类型名称以及一个指向该类型的参照。
MemberRef模块中每个参照成员(字段,方法,属性以及事件)的条目,包含了成员的名称,签名,以及对应类型的 TypeRef 指针。

使用以下命令,用 ILDasm.exe 来察看元数据表:

ILDasm Program.exe

选择 View/MetaInfo/Show! 菜单项 (或按 Ctrl+M),切换到较易读的显示风格:

===========================================================
ScopeName : Program.exe
MVID : {CA73FFE8-0D42-4610-A8D3-9276195C35AA}
===========================================================
Global functions
-------------------------------------------------------
Global fields
-------------------------------------------------------
Global MemberRefs
-------------------------------------------------------
TypeDef #1 (02000002)
-------------------------------------------------------
TypDefName: Program (02000002)
Flags : [Public] [AutoLayout] [Class] [Sealed] [AnsiClass]
[BeforeFieldInit] (00100101)
Extends : 01000001 [TypeRef] System.Object
Method #1 (06000001) [ENTRYPOINT]
-------------------------------------------------------
MethodName: Main (06000001)
Flags : [Public] [Static] [HideBySig] [ReuseSlot] (00000096)
RVA : 0x00002050
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
ReturnType: Void
No arguments.
Method #2 (06000002)
-------------------------------------------------------
MethodName: .ctor (06000002)
Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName]
[RTSpecialName] [.ctor] (00001886)
RVA : 0x0000205c
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
TypeRef #1 (01000001)
-------------------------------------------------------
Token: 0x01000001
ResolutionScope: 0x23000001
TypeRefName: System.Object
MemberRef #1 (0a000004)
-------------------------------------------------------
Member: (0a000004) .ctor:
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
TypeRef #2 (01000002)
-------------------------------------------------------
Token: 0x01000002
ResolutionScope: 0x23000001
TypeRefName: System.Runtime.CompilerServices.CompilationRelaxationsAttribute
MemberRef #1 (0a000001)
-------------------------------------------------------
Member: (0a000001) .ctor:
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
1 Arguments
Argument #1: I4
TypeRef #3 (01000003)
-------------------------------------------------------
Token: 0x01000003
ResolutionScope: 0x23000001
TypeRefName: System.Runtime.CompilerServices.RuntimeCompatibilityAttribute
MemberRef #1 (0a000002)
-------------------------------------------------------
Member: (0a000002) .ctor:
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
No arguments.
TypeRef #4 (01000004)
-------------------------------------------------------
Token: 0x01000004
ResolutionScope: 0x23000001
TypeRefName: System.Console
MemberRef #1 (0a000003)
-------------------------------------------------------
Member: (0a000003) WriteLine:
CallCnvntn: [DEFAULT]
ReturnType: Void
1 Arguments
Argument #1: String
Assembly
-------------------------------------------------------
Token: 0x20000001
Name : Program
Public Key :
Hash Algorithm : 0x00008004
Version: 0.0.0.0
Major Version: 0x00000000
Minor Version: 0x00000000
Build Number: 0x00000000
Revision Number: 0x00000000
Locale: <null>
Flags : [none] (00000000)
CustomAttribute #1 (0c000001)
-------------------------------------------------------
CustomAttribute Type: 0a000001
CustomAttributeName:
System.Runtime.CompilerServices.CompilationRelaxationsAttribute ::
instance void .ctor(int32)
Length: 8
Value : 01 00 08 00 00 00 00 00 > <
ctor args: (8)
CustomAttribute #2 (0c000002)
-------------------------------------------------------
CustomAttribute Type: 0a000002
CustomAttributeName: System.Runtime.CompilerServices.RuntimeCompatibilityAttribute ::
instance void .ctor()
Length: 30
Value : 01 00 01 00 54 02 16 57 72 61 70 4e 6f 6e 45 78 > T WrapNonEx<
: 63 65 70 74 69 6f 6e 54 68 72 6f 77 73 01 >ceptionThrows <
ctor args: ()
AssemblyRef #1 (23000001)
-------------------------------------------------------
Token: 0x23000001
Public Key or Token: b7 7a 5c 56 19 34 e0 89
Name: mscorlib
Version: 4.0.0.0
Major Version: 0x00000004
Minor Version: 0x00000000
Build Number: 0x00000000
Revision Number: 0x00000000
Locale: <null>
HashValue Blob:
Flags: [none] (00000000)
User Strings
-------------------------------------------------------
70000001 : ( 2) L"Hi"
Coff symbol name overhead: 0
===========================================================
===========================================================
===========================================================

这里你可以看到 Program.exe 包含一个名为Program 的 TypeDef,这个类型是一个继承自System.Object 的 public sealed 的类。该类有两个方法:Main 和 .ctor (构造函数),Main 是一个 public, static 的方法,没有返回值没有参数;构造函数是一个 public 方法也没有返回值没有参数。其中还有一个 this 指针,指向被构造好的该对象地址。

在ILDasm 中选择 View/Statistics 菜单项后,以下信息被显示:

File size : 3584
PE header size : 512 (496 used) (14.29%)
PE additional info : 1411 (39.37%)
Num.of PE sections : 3
CLR header size : 72 ( 2.01%)
CLR meta-data size : 612 (17.08%)
CLR additional info : 0 ( 0.00%)
CLR method headers : 2 ( 0.06%)
Managed code : 20 ( 0.56%)
Data : 2048 (57.14%)
Unaccounted : -1093 (-30.50%)
Num.of PE sections : 3
.text - 1024
.rsrc - 1536
.reloc - 512
CLR meta-data size : 612
Module - 1 (10 bytes)
TypeDef - 2 (28 bytes) 0 interfaces, 0 explicit layout
TypeRef - 4 (24 bytes)
MethodDef - 2 (28 bytes) 0 abstract, 0 native, 2 bodies
MemberRef - 4 (24 bytes)
CustomAttribute- 2 (12 bytes)
Assembly - 1 (22 bytes)
AssemblyRef - 1 (20 bytes)
Strings - 184 bytes
Blobs - 68 bytes
UserStrings - 8 bytes
Guids - 16 bytes
Uncategorized - 168 bytes
CLR method headers : 2
Num.of method bodies - 2
Num.of fat headers - 0
Num.of tiny headers - 2
Managed code : 20
Ave method size - 10

这里可以查看到文件大小,以及各部分的组成。(注意:ILDasm.exe 显示的文件大小并不准确,这似乎是个bug)

西门子1200之PID用法与控制 西门子PID加热试验 阅读详情

相关推荐

RTAB-MAP实战:用Realsense D435i在ROS中搭建室内3D地图(附避坑指南)

本文详细介绍了如何在ROS环境下,使用Intel Realsense D435i深度相机和RTAB-MAP算法进行室内3D地图构建的完整实战流程。内容涵盖环境配置、核心节点数据流解析、关键参数调优、地图保存与重定位,并提供了实用的避坑指南,帮助机器人开发者和研究者快速实现稳定的视觉SLAM应用。

weixin_29095049的博客 489

c# dll程序集元数据概述

c# dll程序集概述什么是程序集PE文件元数据组成元数据定义表引用元数据表清单元数据表 程序集是一个或多个类型定义文件以及资源文件的集合。程序集是进行重用,版本控制和应用安全设置的基本单元,它允许将类型和资源文件划分到单独的文件中。这样一来无论是自己还是程序集用户都可以决定打包和部署哪些文件。

qq_17347313的博客 1940

智能座舱通信技术解析:从CAN总线到车载以太网与V2X

在汽车电子与智能网联快速融合的背景下,座舱智能化已不再是简单的屏幕堆砌,而是依赖底层通信技术构建的复杂系统。CAN总线因高可靠性与确定性传输,持续承担车身控制与安全信号的传递;车载以太网则凭借高带宽优势,成为多屏高清视频与OTA升级的核心通道;V2X车路协同技术进一步将座舱与外界的实时信息互联。理解这些技术的分工协作,是掌握智能座舱架构、开展座舱测试与故障排查的关键。本文从实际测试经验出发,梳理不同总线在座舱内部及外部的应用逻辑,结合低成本的实验台架搭建指南,展示从信号采集、网关转发到多媒体流传输的完整链路

weixin_29284657的博客 341

《CLR via C#》读书笔记-CLR寄宿与AppDomain

CLR寄存和AppDomain的简介

郑林的专栏 1382

使用 ChatGPT/Copilot 提升前端开发效率的 N 种方式

typescript// 输入:根据这个 JavaScript 对象,生成完整的 TypeScript 类型定义id: '123',stock: 50,},// ChatGPT 生成:id: string;discount?: number;// 可选属性// 只读属性// 更进一步,生成 Zod schema 用于运行时验证:});}),});AI 代码助手真正的革命性不在于它能生成多少代码,而在于它改变了我们解决问题的方式。

fineday 1589

在ROS中使用行为树

在ROS中使用行为树 我提供的工程示例文件: demo链接 文章目录在ROS中使用行为树0、 学习本教程的前提1、 behaviorTree 库安装(ROS使用下的安装方式)2、 处理 behaviortree 库并准备好 service 和 ros action2.1 对ROS 的 service 和 action 进行封装,使其在 behaviortree 上使用更加方便。2.2 创建一个 service 和一个 action2.3 创建与决策树相关的数据类型2.4 修改`package.xml`文件2

qq_37416258的博客 6375

【CLR VIA C#】读书笔记

工作几年了才看,记录下笔记备忘。 章节 笔记 1.CLR的执行模型 公共语言运行时(Common Language Runtime,CLR) 源代码-->编译器检查语法...

weixin_30449453的博客 282

从仿真到实践:两级直接耦合放大电路的静态工作点协同调试指南

本文详细解析了两级直接耦合放大电路的静态工作点协同调试方法,从仿真到实践提供系统指南。重点介绍了Rc2电阻调整技巧、集电极电位测量方法及常见问题排查,帮助工程师解决各级静态工作点相互影响的难题,提升模拟电路设计效率。

weixin_29189373的博客 124

《CLR Via C#》读书笔记,持续更新...

《CLR Via C#》读书笔记,持续更新... 写了快5年代码了,一直都是使用别人发明的语言,别人发明的框架做快速开发,还从来没有真正深刻的学习过底层的一些东西,于是今年我打算读《CLR Via C#》这本书,认识一下C#的底层,我觉得看这本书起码对日后代码的调优有用,以下读书笔记仅记录我在读书过程中看到的认为有用的,平时不容易被注意到...

weixin_30681615的博客 227

5. SAP UI5 视图控制器(Controller)初探

本教程的前一个步骤也就是第四个步骤,我们了解了 SAP UI5 XML 视图的使用方法。在该步骤里,我们在 XML 视图里声明了一个 Text 控件实例,该控件位于 sap.m 这个命名空间内。 本步骤会继续接触 SAP UI5 MVC 框架中三大基石的另一块:C - Controller,即控制器。 先看看本步骤完成之后,我们得到的 SAP UI5 应用能实现一个什么样的效果。 访问如下 url: http://localhost:8080/webapp/index.html 能看到一个 Say Hell

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4592

Pytorch入门教程

Pytorch学习总结:1.张量Tensor 张量是一种特殊的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量对模型的输入和输出以及模型的参数进行编码。 张量类似于NumPy的ndarray,除了张量可以在 GPU 或其他硬件加速器上运行。事实上,张量和NumPy数组通常可以共享相同的底层内存,从而无需复制数据。...

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 4万+

CLR via C# 3 读书笔记(2):第1章 CLR执行模型 — 1.2 将托管模块组合为程序集

实际上,CLR直接打交道的是程序集,而不是模块。程序集是一个抽象的概念,首先,它是一个或多个模块或资源文件的逻辑组合(即程序集由多个模块和资源文件组成)。其次,它是复用、安全、版本的最小单元。根据所选择的编译器和工具的不同,可以生成单一文件或多个文件的程序集。在CLR世界里,程序集就是我们称作组件(component)的东西。 程序集提供了一种方式,将一组文件看作一个单独的实体。 下图解释了什么是...

weixin_30916125的博客 90

【华为OD机试真题】459、小扇和小船的数字游戏、数字游戏 | 机试真题+思路参考+代码解析(CD卷)(C++、Java、Py)

### 🎃题目描述 >小扇和小船今天又玩起来了数字游戏,小船给小扇一个正整数 n(1  现在求 m 的最小值

KJ.JK 1717

CLR via C# 读书笔记 3-2 AutoResetEvent ManualResetEvent 和Semaphore

这三个对象都经常用于线程同步 下面是一些他们的异同点 1.当多个线程在等待一个 AutoResetEvent的时候,每次调用AutoResetEvent.Set()方法只会唤醒一个线程 2.当多个线程在等待一个ManualResetEvent的时候,每次调用ManualResetEvent.Set()方法会唤醒所有等待的线程 3.当多个线程在等待一个Semaphore的时候,每次调用...

weixin_30322405的博客 111

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CLR via C# 读书笔记 2-3 Cache Lines and False Sharing(高速缓冲区和错误共享???)

因为水平有限 不知道怎么用中文表达Cache Lines 和 False Sharing (暂时把他们翻译为 高速缓冲区和错误共享,如有谬误,还请有识之士指正) 现在的cpu 一般拥有多个核心和一个cpu内的缓存(一般是L2?) 这些缓存一般位于cpu芯片内, 他的速度远远高于主板上的内存, 一般来说cpu会把数据从内存加载到缓存中 ,这样可以获得更好的性能(特别是频繁使用的数据) ...

weixin_30723433的博客 91

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

CLR via C# 3 读书笔记(11):第2章 生成、打包、部署和管理应用程序与类型 — 2.3 元数据简介...

我们已经知道了我们所创建的是哪种类型的PE文件。但Program.exe文件内部究竟是什么呢?一个托管的PE文件包括4个部分:PE32(+)头,CLR头,元数据和IL。PE32(+)头是Windows所要求的标准信息。CLR头是一个小的信息块,专门用于那些需要CLR才能运行的模块(托管模块)。包括和模块一起创建的CLR主次版本号,一些标记,如果模块是CUI或GUI可执行文件还会有一个MentodD...

weixin_33906657的博客 149

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

2.1节主要介绍.NET Framework的部署目标。作者首先提出Windows系统复杂且不稳定,接着分析原因(DLL hell、安装的复杂性和安全问题)。而.NET Framework很大程度上解决了DLL hell,安装也简化了,并且包含了代码访问安全(code access security)这样一个安全模型。 在2.2节中,主要介绍如何将一个包含不同类型的源文件,转换为可部署的文件。以...

weixin_34260991的博客 129

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

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

weixin_33807284的博客 147

CLR via C# 3 读书笔记(14):第2章 生成、打包、部署和管理应用程序与类型 — 2.5 程序集版本资源信息...

当AL.exe或CSC.exe生成PE文件程序集时,还在PE文件中内嵌了一个标准的Win32版本资源。用户可以查看文件属性找到该资源。应用程序代码还可以在运行时调用System.Diagnostics.FileVersionInfo的GetVersionInfo静态方法来得到资源信息。下图显示了JeffTypes.dll属性对话框的Details选项卡。 当生成程序集时,我们应该使用自定...

weixin_30767835的博客 125

CLR via C# 3 读书笔记(17):第3章 共享程序集和强命名程序集 — 3.1 两种程序集,两种部署方式 & 3.2 对程序集进行强命名...

第2章讨论的主要是私有部署(private deployment),即程序集放在应用程序的根目录及其子目录中。以私有方式部署程序集可以在很大程度上控制程序集的命名、版本化和行为。 本章将讨论的是可以被多个应用程序共同访问的程序集,全局部署程序集(globally deployed assembly)。 两种程序集,两种部署方式 CLR支持两种程序集:弱命名程序集(weakly named a...

weixin_34390105的博客 158

CLR via C# 3 读书笔记(16):第2章 生成、打包、部署和管理应用程序与类型 — 2.8 简单管理控制(配置)...

用户或管理员可以在很大程度上决定应用程序的执行。例如,管理员可以决定将程序集文件移动到用户硬盘上,或者重写程序集清单中的信息。 要对应用程序进行管理控制,可以在程序目录中放置一个配置文件。程序发布者创建该配置文件并打包。此外,机器的管理员或最终用户也可以创建或修改。CLR通过解析该文件的内容来更改定位和加载程序集文件的策略。 这些配置文件都是XML格式的,可以和应用程序或计算机相关联。使用单独...

weixin_34037977的博客 110

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

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

weixin_30249203的博客 126
上一篇: CLR via C# 读书笔记2-2
下一篇: 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、付费专栏及课程。

余额充值