当前位置: 首页 > news >正文

.Net与程序集

一个简单的C#程序

回想一下我们第一个.net 程序 hello world,它具有那些步骤呢

  1. 打开visual studio

  1. 创建一个C# console的项目

  1. build

  1. 运行程序

这时候就有一个命令行窗口弹出来,上面打印着hello world。我们打开文件夹的bin目录,会发现里面多了一个.dll文件和一个.exe文件。我们用dotnet run命令就可以运行起来这个程序。

过去在使用VC++生成的可执行文件,经过了预编译,编译,汇编,链接这几步以后,生成了Native code,这样在操作系统和本地机器指令集的支持下,程序就开始运行了。C#作为高级语言,而且是跨平台的语言,它是如何才能让操作系统认识它的呢?

CIL/IL-公共中间语言

Java会先把java代码转化为字节码,然后再通过JVM中的编译器JIT编译成本地代码后运行的。

C#也是一样的 c#通过C#编译器编译为IL代码,然后经过JIT编译为本地代码。

IL代码和字节码是类似的。

我们可以通过dnSpy工具查看.dll文件的内容,这就能直观的看到IL代码。

IL代码只是比C#低级一些,也不能直接被CPU执行,IL语言需要.Net运行时环境的支持,执行前会被JIT(Just-in-time)的二次编译,才能转变为计算机可以识别的指令。因此IL代码也叫做托管代码。不需要.net 运行时就可以直接运行的代码叫做非托管代码。

BCL

我们在写Console.Wirte()这个方法时,会疑惑这个方法从何而来。我们打开Visual stdio,查看一个程序的Dependencies, 就会发现里面引入了System.Console这个类。并且无法删除。

BCL就是提供了像Console这样的类型来支持开发者编写,也就是基础类库。

FCL

这是.Net的框架类库,BCL是FCL的一个子集。

BCL提供基元类型, 集合类型, 线程处理, AppDomain, Runtime等程序最为基本的封装。

然后要提供类似网络,文件等对操作系统的封装。

最后是Windows Form, Asp .net, WCF这种大型框架。

CTS

CTS定义了一套语言可以做什么,不能做什么,是一套规则。满足了这个规则的语言就是面向.NET框架的语言。比如C#有类,对象,枚举,结构体,委托,方法,事件,访问性(Private, public, protected),assembly等等。

CLS

首先提出一个问题,用VB写的程序集,可以被c#项目引用吗?

C#和VB可以很好的运行在.net框架下,但是他们是无法相互引用的,如果要让C#项目能够引用VB,那么VB中的公开类型就要满足C#的语言特性,就是说要有共通之处。

世界上有很多种语言,所以我们需要一个规范,只要满足这个规范,就能被其他语言的程序集所使用。这个规范就是CLS

CLR

CLR有时也会称作.NET运行时。

.dll和.exe有个别名叫做程序集。

在windows环境下,.exe给人的感觉就是双击以后就开始运行,.NET程序首先要是一个windows可执行程序。Windows想要加载.dll或者.exe是因为它可以理解PE/COFF文件格式,也就是windows可移植可执行/通用对象文件格式。

程序集中的IL代码不能直接被机器执行,还需要即时编译,编译前需要将编译的环境运行起来,所以PE/COFF头之后就是CLR头,CLR头告诉操作系统这是.NET程序集,区别其他的可执行文件。

接下来就是清单,清单相当于一个目录,描述程序集名称,版本,程序集包含的Resources, 组成程序集的文件。

下面是元数据,清单描述了程序集自身信息, 元数据描述了程序集所包含的内容,比如类型,类型成员, 类型和类型成员的可见性。元数据不包含类型实现,查看元数据的过程就是反射。

下面是程序代码,就是IL代码。

最后是资源文件,比如一些html, css, js ,jpg

这里简单的介绍了一下程序集。

CLR就是一个软件层,管理.NET程序集的执行,提供管理应用程序域,加载运行程序集,安全检查,将CIL代码即时编译为机器代码、异常处理、对象析构和垃圾回收等。CLR还有一种叫法,即VES(Virtual Execution System,虚拟执行系统),我觉得这个描述更加的准确, 类似于java虚拟机。

如何运行一个程序集

  1. 操作系统在尝试打开一个托管程序集(.exe)时,首先会检查PE头,根据PE头来创建合适的进程。

  1. 接下来会进一步检查是否存在CLR头,如果存在,就会立即载入MsCorEE.dll。这个库文件是.NET框架的核心组件之一,注意它也不是一个程序集。

  1. 加载了MsCorEE.dll之后,会调用其中的_CorExeMain()函数,该函数会加载合适版本的CLR。

  1. 在CLR运行之后,程序的执行权就交给了CLR。CLR会找到程序的入口点,通常是Main()方法,然后执行它。这里又包含了以下过程:

  1. 加载类型。

  1. 验证。

  1. 即时编译。

  1. 加载类型: 在执行main()方法以前,Class loader要找到拥有Main()方法的类型(Program.cs 中的 Program类)并且加载,会从配置文件,程序集元数据中找到这个类型,然后把类型信息加载到内存,并且缓存。并给每个方法插入存根(stub)。

  1. 验证:保证代码类型安全,主要就是看元数据和类型签名。

  1. 即时编译:把托管代码IL编译为机器代码。即时编译只有方法第一次调用时发生。在调用方法时,CLR会检查方法的存根,如果存根为空,则执行JIT编译过程,并将该方法被编译后的本地机器代码地址写入到方法存根中。当第二次对同一方法进行调用时,会再次检查这个存根,如果发现其保存了本地机器代码的地址,则直接跳转到本地机器代码进行执行,无须再次进行JIT编译。

程序集

程序集主要包括程序集模块,程序集资源和强名称程序集。

程序集模块

这是一个中间的逻辑结构,程序集可以包含一个或者多个模块,每个模块的内容就是PE/coff, CLR头,清单,元数据,CIL代码, 资源文件。这个现在没怎么用了,visual studio也都是生成的单模块程序集。

程序集资源

程序集中包含资源, 资源可以是字符串,也可以是一些文件, 比如图片和Excel。

强名称程序集

特点和功能:

  1. 唯一标识一个程序集。

  1. 防止程序集被仿冒和被篡改。

  1. 可以部署到全局程序集缓存(GAC)之中。

举个没有强名称程序集的例子:

假设有一个类库ClassLib, 一个控制台项目ConsoleApp想要引用ClassLib,如果ClassLib.dll是非强名称的程序集,那只能私有部署。通过项目引用或者Reference引用,本质上就是复制一份ClassLib.dll副本到ConsoleAPP的根目录下。

这里有两个属性分别是“复制本地”和“路径,开启复制本地时,编译时会自动复制ClassLib.dll到应用程序根目录。路径指的就是程序集的位置。

如果没有强程序集,有三个ConsoleApp都要引用这个ClassLib, 但是ConsoleApp1, ConsoleApp2, ConsoleApp3都不是同时开发的,而且ClassLib也在维护中。本来ConsoleApp1要引用版本1的ClassLib现在成了版本3了,ClassLib的版本1和3又不兼容,就错误了。

如果你想用其他公司开发的ClassLib.dll,那你的dll就会被冲突掉,因为Window系统的同一个文件夹下,是通过文件名来区分不同文件的,文件名称相同就会被覆盖。

如果没有强程序集会遇到什么问题?

版本冲突:如果多个程序集具有相同的名称和版本号,但是公钥不同,运行时会被视为不同的程序集,导致版本冲突。

安全性: 没有强命名的程序集可能被恶意软件篡改。

部署问题: 如果想在多个计算机上用程序集,那就必须是强程序集,否则无法工作。

强名称和GAC就是来解决这个问题的。

强名称:定义一个规则,不单单以文件名区分程序集。

GAC: 特殊文件夹,可以识别强名称的规则,允许相同的文件名存在。

相关文章:

.Net与程序集

一个简单的C#程序回想一下我们第一个.net 程序 hello world,它具有那些步骤呢?打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来,上面打印着hello world。我们打开文件夹的bin目录,会发现里…...

软考中级之数据库系统(重点)

涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…...

界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能齐…...

【架构师】零基础到精通——网关策略

博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名退役Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小…...

【java 8】方法引用与构造器引用

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…...

SGI 空间配置器

前言 空间配置器是 STL 六大组件之一,它总是隐藏在容器的背后,默默工作,默默付出。本文为《STL 源码剖析》读书笔记,主要讨论 SGI 版本空间的配置和释放,对代码进行解读时会改变一些写法,使其更易于阅读。…...

2023年白酒行业研究报告

第一章 行业概况 白酒是中国传统的酿酒业之一,历史悠久,源远流长。白酒指以高粱等粮谷为主要原料,以大曲、小曲或麸曲及酒母等为糖化发酵剂,经蒸煮、糖化、发酵、蒸馏、陈酿、勾兑而制成的,酒精度(体积分数)在18%-68%…...

华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 【2023】

合规数组 题目 给定一个正整数数组 检查数组中是否存在满足规则的数组组合 规则: A = B + 2C 输入 第一行输出数组的元素个数 接下来一行输出所有数组元素,用空格隔开 输出 如果存在满足要求的数 在同一行里依次输出规则里A B C的取值,用空格隔开 如果不存在输出0 示…...

华为OD机试真题Python实现【英文输入法】真题+解题思路+代码(20222023)

英文输入法 主管期望你来实现英文输入法单词联想功能,需求如下: 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词。按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。注意 英文单词联想时区分大小写缩略形式如"don’t&quo…...

改进YOLO系列 | 添加轻量化Decouple_Head 和 ASFF_Head

绿色为ASFF_Head,浅蓝色Decoupled_Head,深蓝色是第三步加的_initialize_dh_biases方法后的效果。 参数量与计算量对比 模型参数量 parameters计算量GFLOPsyolov5s_Head723538916.5ASFF_Head1267484725.0Decoupled_Head892869722.0结构图 本篇介绍的这个Decouple_Head和YOLOX…...

LLFlow沦为和代码解读

LLFlow沦为和代码解读 1.测试时代码的运行位置 sr:什么意思 sr 和 z 这里又将模型设置为了训练模式 所以下面这部分代码应该是测试时运行的所有代码 这个就是测试时使用的网络模型框架 下面应该就是self.netG的网络模型框架 但是这个z的网络模型框架代码还不…...

C语言学习及复习笔记-【9】数组

目录9. 数组9.1 数组的定义9.2 数组与指针的区别9.3 数组大小计算9.4 数组的赋值9.5多维数组寻址方式9.6 函数数组9. 数组 9.1 数组的定义 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往…...

Kubernetes入门教程 --- 使用kubeadm进行集群安装

Kubernetes入门教程 --- 使用kubeadm和二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.5 时间同步2.6 安装组件2.7 部署集群2.8 Master安装网络插卡3. 查询状态3.1 查询n…...

华为OD机试真题Python实现【相对开音节】真题+解题思路+代码(20222023)

相对开音节 题目 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外) 常见的单词有bike cake 给定一个字符串,以空格为分隔符 反转每个单词的字母 若单词中包含如数字等其他非字母时不进行反转 反转后计算其中含有相对开音节结构的子串个数 (连续子串中部分字符可以重复) …...

海思SD3403/SS928V100开发(5)MIPI_YUV相机vio sample开发----修改思路

1. 前言 sensor输出格式: YUV422 8bit 硬件连接: MIPI_YUV相机(4lane MIPI) -> SS928V100 MIPI0(4lane) 框图: 2. 几个问题 基于SS928 SDK中的 vio sample修改; 但是sample里面都是基于RAW RGB sensor开发的sample, 没有现成的MIPI_YUV sensor的参考,需要自己…...

javaee之node.js与es6

问题1:在IDEA控制台为什么node显示不会出来命令 修改完之后记得重新启动电脑 问题2:response.end()作用 在Web开发中,浏览器端的请求到达服务器进行处理的时候,Response.End的作用就是让request执行到此结束,输出到客户…...

11 nacos源码开篇

nacos核心功能点: 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存…...

13.Jenkins集成sonarqube

Jenkins集成sonarqube1.jenkins集成sonarqube2.jenkins以maven的方式集成sonarqube scanner报错1报错21.jenkins集成sonarqube 1.在jenkins插件管理中安装sonarqube scanner 2.jenkins要知道sonarqube服务端是谁,需要配置(系统管理–系统配置–sonarq…...

JavaWeb13-线程休眠和指定唤醒:LockSupport

目录 1.LockSupport.park():休眠当前线程 2.LockSupport.unpark(线程对象):唤醒某一个指定的线程 3.扩展:LockSupport.parkUntil(long)等待最大时间是一个固定时间 4.LockSupport和Interrupt 5.LockSupport VS wait 相同点:…...

【第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式创建对象,注入属性)】

第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式创建对象,注入属性) 1.Spring是什么? ①Spring是一款主流的java EE 轻量级开源框架。 ②广义的Spring:Spring技术栈,Spring不再…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC&#xf…...