首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在调用程序集中的任何方法之前,CLR 最早调用的入口点是什么?

在调用程序集中的任何方法之前,CLR 最早调用的入口点是程序集的入口点。程序集的入口点是程序集中 Main 方法的位置,它是程序的起点,是程序开始执行的第一个方法。

在程序集的入口点,CLR 会执行以下操作:

  1. 初始化程序集的静态变量和静态构造函数。
  2. 调用 Main 方法,并传递命令行参数。
  3. 等待 Main 方法执行完毕,并返回退出代码。
  4. 销毁程序集的静态变量和静态构造函数。

在程序集的入口点之前,CLR 会执行以下操作:

  1. 加载程序集。
  2. 验证程序集的元数据和代码。
  3. 初始化程序集的静态变量和静态构造函数。
  4. 调用程序集的入口点,即 Main 方法。

CLR 最早调用的入口点是程序集的入口点,它是程序的起点,是程序开始执行的第一个方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

net框架运行原理

程序集中有一些托管模块和资源文件,通过CLR处理后在内部得到所有文件逻辑组合关系,得到一个清单数据块,这些内容描述了组成程序文件;注意:程序集中还包含它所引用其它程序一些信息,这些信息可以使程序集实现自描述...,这样也就让CLR执行不再到注册表中取,因此让程序部署要比非托管组件部署容易得多; 安装VS08,其主要就是CLR安装,CLR负责管理包含在程序集中代码执行;系统文件中mscoree.dll...,CLR加载程序时候江通过这些信息定位到应用程序入口方法,这样就启动了应用程序;注意非托管程序如果调用托管程序集,托管程序集DLL入口函数也会去让CLR来处理包含在其中代码; mscoree.dll...; CLR不能直接执行IL代码,IL代码还需要通过JIT即时编译器转换成CPU指令; CLR工作方式:检测代码中引用到所有类型,分配一个内部数据结构来管理引用类型访问;当有方法调用时代码被即时编译验证并转换成...CPU指令,并动态保存在内存中;这样,一个方法只有首次调用时,才会产生一些性能损失,后续调用时不再进行验证转换,而命令CPU做全速执行。

1.1K30

通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

程序入口方法 2)CLR版本号等一些标志 3)一个可选强名称数字签名 4)元数据表,主要用来记录了源代码中定义和引用所有的类型成员(如方法、字段、属性、参数、事件...)位置和其标志Flag(各种修饰符...文件入口(EntryPoint)并跳转至指定mscoree.dll中_CorExeMain函数,该函数会执行一系列相关dll来构造CLR环境,当CLR预热后调用程序入口方法Main(),接下来由...需要值得注意是:当你试图已生成好强名称程序集中引用弱名称程序集,那么你必须对弱名称程序集进行签名并在强名称程序集中重新注册。...A程序集中Func方法调用了B程序集中JsonObj方法,JsonObj方法调用了Newtonsoft.Json 10.0程序集中对象,那么当执行Func方法程序就会异常,报System.IO.FileNotFoundException...而默认域则用储存自身程序信息,我们程序集就会被加载至这个默认域中,执行程序入口方法没有特殊动作外所产生一切耗费都发生在该域。

2.7K63
  • 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

    )后,调用_CorDllMain或_CorExeMain来查找并执行托管程序入口方法(如控制台就是Main方法)。...2.CLR头,它是托管模块特有的,它主要包括 1)程序入口方法 2)CLR版本号等一些标志 3)一个可选强名称数字签名 4)元数据表,主要用来记录了源代码中定义和引用所有的类型成员...文件入口(EntryPoint)并跳转至指定mscoree.dll中_CorExeMain函数,该函数会执行一系列相关dll来构造CLR环境,当CLR预热后调用程序入口方法Main(),接下来由...需要值得注意是:当你试图已生成好强名称程序集中引用弱名称程序集,那么你必须对弱名称程序集进行签名并在强名称程序集中重新注册。...Func方法调用了B程序集中JsonObj方法,JsonObj方法调用了Newtonsoft.Json 10.0程序集中对象,那么当执行Func方法程序就会异常,报System.IO.FileNotFoundException

    4.4K30

    c#面试题抽象类和接口区别-金三银四面试:C#程序员经常遇到30道基础面试题,想你所想

    28、CLR与IL分别是什么含义?   29、对象能否调用静态方法?   30、请编写创建一个线程代码?   1、请解释new与区别?   C#中,new关键字可用作运算符和修饰符。   ....;   11、C#中有没有静态构造函数,如果有是做什么用?   有。静态构造函数用于初始化类。创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。...创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。程序中,用户无法控制何时执行静态构造函数。   ...程序集是重用代码一种方式,通常对应一个工程类库(dll),一个程序集中可以有属于不同命名空间类和接口。...28、CLR与IL分别是什么含义?

    1.9K20

    MSSQL横向移动

    对于2017年之前和之后服务器版本,运行“ UNSAFE” CLR所需初始步骤有所不同。...SQL Server 2017之前 显示高级选项: sp_configure 'show advanced options',1;RECONFIGURE 启用CLR: sp_configure 'clr...; 将程序SHA512哈希添加到受信任程序集列表中: sp_add_trusted_assembly @hash= ; 从这一出发,对于任何SQL Server版本,...为了简化CLR代码创建和调用,制作了执行以下操作GUI应用程序: 收集连接字符串数据 从原始二进制文件和单字节XOR读取Shellcode字节 生成一个MSSQL CLR DLL,该DLL对shellcode...在这种情况下,例如,来自.NET内部CreateRemoteThread调用可能会触发检测 通过SQL命令调用程序过程还会导致将几个具有不同名称相同文件写入SQL服务帐户临时目录。

    3.1K10

    .Net 框架

    引入这个概念之前,前面(上一节)提到程序集时,都是用“文件”这个词来描述程序定义只是给编译后生成文件一个稍微正式一名称,对于解释“它是由什么构成”这个问题并没有太大帮助。...了解CLR之前,需要先进一步学习一下程序集,因为下一节会对程序集进行专门讲述,这里仅简单介绍一下程序集中对于理解CLR有帮助概念。...CLR会找到程序入口,通常是Main()方法,然后执行它。这里又包含了以下过程: 加载类型。执行Main()方法之前,首先要找到拥有Main()方法类型并且加载这个类型。...这一步就是将托管CIL代码编译为可以执行机器代码过程,由CLR即时编译器(JIT Complier)完成。即时编译只有方法第一次调用时发生。回想一下,类型加载程序会为每个方法插入一个存根。...调用方法时,CLR会检查方法存根,如果存根为空,则执行JIT编译过程,并将该方法被编译后本地机器代码地址写入到方法存根中。

    1.9K21

    解析.NET对象跨应用程序域访问(上篇)

    .NET项目中,分布式架构对项目的开发也有很大效率提升。    很多人会问,这些分布式框架底层原理是什么呢?...该方法将目标AppDomain加载到程序集中,并且执行其主入口父AppDomain种,ExecuteAssembly方法不会加载或者初始化指定程序集。...ExecuteAssembly是一个同步例程,这就意味着调用者将被阻塞,直到程序Main方法把控制权交还运行时。    ...该方法接收三个参数,assemblyFile:包含要执行程序文件名称;assemblySecurity:为程序集提供证据;args:程序入口实参。该方法返回 程序入口返回值。...实际项目中,很少直接取操作应用程序域,比较多是直接操作程序集,所以本文最后给出了一个就暗淡程序操作方法

    1K50

    .NET基础:应用程序域AppDomain

    一、应用程序域AppDomain 介绍插件技术之前、我们需要先了解一些基础性知识,第一个就是应用程序域AppDomain. 操作系统和运行时环境通常会在应用程序间提供某种形式隔离。... .NET中应用程序域AppDomain是CLR运行单元,它可以加载应用程序集Assembly、创建对象以及执行程序。...CLR启用时,会创建一个默认AppDomain,程序入口(Main方法)就是在这个默认AppDomain中执行。...Assembly不能单独执行,它必须被加载到AppDomain中,然后由AppDomain创建程序集中类型 及 对象。..."; // 虽然此方法已经被标记为过时方法, msdn备注也提倡不使用该方法, // 但是 以.net 4.0 + win10环境测试,还必须调用方法 否则,即便卸载了应用程序域 dll 还是未被解除锁定

    1.2K60

    .NET简谈互操作(三:基础知识之DllImport特性)

    进行互操作时候,我们需要用DllImport来标识该方法是非托管代码方法,在编译器编译时候它能够正确认识出被该特性标记是外来代码段,所以能顺利通过编译,当到达程序运行时候,也能够正确认识出该代码是引用非托管代码...,这样就让我们CLR去加载非托管DLL文件,然后查找到入口进行调用;我们拿上一篇文章中示例来讲吧; [DllImport("Win32DLL.dll", EntryPoint = "add", CharSet...图2: EntryPoint属性是用来确定非托管方法入口是什么图1中,我非托管代码入口点名称是add,也就是说明一个问题,系统识别非托管代码名称是靠Entrypoint属性来,而不是我们...C#编辑器中申明托管代码名称AddNumber,系统只用Entrypoint来确定非托管入口,而我们可以用随意名称来定义非托管调用名称,这往往是个好方法,由于我们托管代码经常要讲究一些对象化编程方法...CallingConvention可选属性; CallingConvention属性也是一个比较重要属性,平台调用过程中起到查找入口作用,托管代码进行非托管代码入口查找时,会通过CallingConvention

    66710

    《你必须知道.NET》读书笔记:从Hello World认识IL

    元数据和IL是CLR基础,了解必要IL是深入认识CLR捷径,我们没有理由放弃一条可以直接通达大门便捷之路而盲目地以其他方式追求深入。...Reflector出现使·NET程序员眼前豁然开朗,因为这个免费工具可以将·NET程序集中IL反编译成C#或者Visual Basic代码。...除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员概要信息、提供查看程序集中IL能力以及提供对第三方插件支持。 ?...;   ② .ctor指令表示构造函数,代码里没有任何显示构造函数,因此这里调用基类System.Object构造函数(System.Object位于mscorlib程序集中);   (3)其次,HelloIL...ret } .method static void Main() cil managed { // 表明程序入口

    45120

    C# IL DASM 使用

    IL DASM反编译工具   使用C#猿人或多或少都会对微软IL反编译工具(ildasm.exe)有所认识。我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改。...并且它继承自程序集—mscorlibSystem.Object类; 2)private,表示访问权限; 3)auto,表示程序内存加载全部由CLR来控制; 4)ansi,是为了没有托管代码与托管代码之间实现无缝转换...这里主要指C、C++代码等; 5)beforefieldinit,是用来标记运行库(CLR)可以静态字段方法生成后任意时刻,来加载构造器(构造函数); .ctor 方法代码: .method public...而另一指令callvirt则表示调用实例方法, 它是在运行时确定,因为如前述,当调用方法继承关系时,就要比较基类与派生类同名函数实现方法(virtual和new),以确定调用函数所属Method...,同上构造函数; 2).entrypoint:指令表示CLR加载程序时,是首先从.entrypoint开始,即从Main方法作为程序入口函数; 3)nop:为空该指令,主要给外部设备或者指令间隙准备时间

    99231

    IL DASM反编译工具使用c# https:www.cnblogs.comcaokai520p4921706.html

    最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改。感觉他还是很强大。   ...并且它继承自程序集—mscorlibSystem.Object类; 2)private,表示访问权限; 3)auto,表示程序内存加载全部由CLR来控制; 4)ansi,是为了没有托管代码与托管代码之间实现无缝转换...这里主要指C、C++代码等; 5)beforefieldinit,是用来标记运行库(CLR)可以静态字段方法生成后任意时刻,来加载构造器(构造函数); .ctor 方法代码: .method public...而另一指令callvirt则表示调用实例方法, 它是在运行时确定,因为如前述,当调用方法继承关系时,就要比较基类与派生类同名函数实现方法(virtual和new),以确定调用函数所属Method...,同上构造函数; 2).entrypoint:指令表示CLR加载程序时,是首先从.entrypoint开始,即从Main方法作为程序入口函数; 3)nop:为空该指令,主要给外部设备或者指令间隙准备时间

    1.7K31

    2-类型基础

    两个受保护方法: MemberwiseClone:非虚方法,它创建一个新类型实例【浅拷贝(共享引用成员)】; Finalize:虚方法,执行垃圾回收之前调用方法; 引用类型new过程: 从托管堆中分配指定类型所需数量字节来作为其存储对象内存空间...方法调用了该字段】; 调用类型实例构造器【CLR并没有要求调用基类中相应构造器】 完成上述操作后返回一个指向新创建对象引用。...2.类型转换 强制类型转换,需要程序员自己负责,如果转换不成功抛出Sysem.InvalidCastException【无效转换】异常; 隐式类型转换,C#不需要特殊语法就可以将对象转换为其任何一个基类型...; is,is检查制定对象是否兼容与指定类型,返回bool; as类型转换,成功返回对象引用,失败返回null; 3.命名空间和程序集 首先CLR没有命名空间概念,也就是CLR根本就不认识命名空间。...CLR是类型完全限定名,一个程序集中可以存在多个命名空间,一个命名空间下也可以包含多个程序集。

    57270

    Donut - 将 .NET 程序集作为 Shellcode 注入

    反射 DLL 加载中间 .NET 程序集以处理错误并提高有效负载稳定性。 中间 .NET 程序集从子进程内内存中加载您 .NET 程序集。 您程序主要入口与您命令行参数一起被调用。...给定任意 .NET 程序集、参数和入口(例如 Program.Main),它会生成与位置无关 shellcode,从内存中加载它。....无论哪种方式,它都会加载到新 AppDomain 中。程序集加载之后但在它运行之前,解密副本将被释放,然后使用 VirtualFree 从内存中释放以阻止内存扫描器。...、一个入口以及您希望使用任何参数。...位进程生成相同 shellcode,请使用“-a”选项: donut.exe -a 1 -f Test.exe -c Test.Program -m Main 您还可以为您指定任何入口提供参数。

    1.9K00

    BypassUAC技术总结

    :父进程是什么权限,此应用程序是什么权限 requireAdministrator:需要以管理员权限来运行,此类应用程序图标右下方会有个盾牌标记 highestAvailable:此程序以当前用户能获取到最高权限运行...如果我们应用程序找到正确dll之前,将我们自己创造dll放入优先级更高搜索目录让应用程序优先加载此dll文件,这就造成了dll劫持。...这个机制简而言之便是可以给CLR提供一个dll,当任何高权限.NET运行时都会主动加载该DLL,我们可以构造恶意dll给CLR加载,从而获得高权限进程如cmd,从而bypassuac。...以及注册表,指定CLSID属性下新建Inprocserver32项,并写入恶意dll路径. 然后通过mmc调用一下gpedit.msc这种程序,即可以高权限执行dll。...这样写 // dllmain.cpp : 定义 DLL 应用程序入口

    87730

    浅谈.Net反射 2

    正式开始介绍反射概念之前,我们先了解一下元数据。 元数据概述 C#代码经过编译之后会得到二进制格式程序集,程序集一般是一个.dll或.exe后缀文件。...CLR头是托管模块所特有的,一般包含以下信息: CLR版本号, 一些标志 模块入口方法 强名称数字签名(可选) 元数据是由几个表构成二进制数据块。...具体包含方法签名和指向方法IL代码索引,以及指向方法参数ParamDef索引。 FieldDef:程序集中定义每一个字段都有一个记录项。 具体包含类型,名称以及编译时期确定静态值等信息。...ParamDef:程序集中定义每一个方法参数都有一个记录项。 具体包含类型,名称以及编译时期确定默认值等信息。 PropertyDef:程序集中定义每一个属性都有一个记录项。...EventDef:程序集中定义每一个事件都有一个记录项。 具体包含委托类型,名称等信息。 在编译源代码时,代码定义任何东西都导致元数据-定义表中创建一个与之对应记录项。

    31920

    CLR via C#》Part2之Chapter4 类型基础(二)

    类型转换 CLR最重要特性之一是安全性,在运行时,通过调用GetType(),总是知道一个对象的确切类型。 CLR允许将一个对象转换为它实际类型或者它任何基类型。...命名空间和程序C#中我们使用using引入命名空间,但是CLR并不知道命名空间任何事,访问一个类型时,CLR需要知道类型完整名称(长、包括句点符号名称)以及该类型定义具体在哪个程序集中。...默认情况下,C#编译器会自动MSCorLib.dll程序集中查找“引用类型”,即使你没有显式告诉它。...运行时相互联系 这一节解释类型、对象、线程栈、和托管堆在运行时相互关系。此外,还将调用静态方法、实例方法和虚方法区别。 下图展示了CLR一个Microsoft Windows进程。 ?...然后M1调用M2方法,将局部变量作为一个实参来传递,这造成name变量地址被压入栈,如下图: ?

    39330

    DotNet程序集解析

    托管程序集中包含元数据和IL(微软一种中间语言),IL能够访问和操作对象类型,并提供了指令来创建和初始化对象、调用对象上方法以及直接操作数组元素。    ...CLR头是一个小信息块,主要包含模块在生成是所面向CLRmajor(主)和major(次)版本号;一个标志,一个MethodDef token(指定了模块入口方法);一个可选强名称数字签名。...接下来介绍一下CLR中加载程序方法:     System.Refection.Assembly类静态方法Load来加载程序集,加载指定程序操作中,会使用LoadFrom()方法,...,然后以一个Syatem.Reflection.AssemblyName对象形式返回这些信息),LoadFrom方法在内部调用AssemblyLoad方法,将AssemblyName对象传给它,CLR...,需要说明是:程序集不提供卸载功能。

    56590

    八、通用类型系统

    1、通用类型简介         CLR一切都围绕类型展开,因为IL是面向对象高级机器语言.类型向应用程序和其他类型公开了功能.通过类型,用一种编程语言写代码能与另一种编程语言写代码沟通.由于类型是...签名指定参数数量(及其顺序).参数类型:方法是否有返回值,如果有返回值,还要指定返回值类型. (3)、属性 对于调用者,属性看起来像是字段.但对于类型实现者,属性看起来像是一个方法(或者两个方法,get...和set方法).属性允许访问值之前校验输入参数和对象状态,以及/或者尽在必要时才计算某个值.属性还允许类型用户采用简化语法.最后,属性只允许创建只读或只写"字段". (4)、事件 时间在对象以及其他相关对象之间实现了通知机制...2)、assembly(C#中使用internal修饰符) 只有同一个程序集中代码才能看见并访问该类型. (3)、private 被private修饰成员智能由同一个类型中其他成员访问 (4)...、family(C#中使用protected修饰符) 成员可由派生类型访问,不管那些类型是否同一程序集中 (5)、protected internal 成员只能由同一程序集中任何类型来访问.

    1.1K60

    快速入门系列--CLR--02多线程

    线程(Thread)是进程中基本执行单元,进程入口执行第一个线程被视为这个进程主线程。.NET应用程序中,都是以Main()方法作为入口,当调用方法时系统就会自动创建一个主线程。...内核模式栈,当调用内核API时会使用 DLL线程连接和分离通知,windows每创建一个线程就会加载所有DLL中入口方法,并传递一个dll_thread_attach方法,当加载dll很多是,这个操作会造成很大性能消耗...CLR初始化时,线程池中是没有线程,其内部维护了一个操作请求队列,应用程序想执行一个异步操作时,就调用某个方法,将一个记录项(entry)追加到线程池队列中。...由于线程可以finally块中执行未绑定计算或调用Thread.ResetAbort来取消中止,所以不能保证线程将完全结束。如果您希望一直等到被中止线程结束,可以调用Thread.Join方法。...一个socket被创建后,可以在任何时刻和一个完成端口联系起来。 一般来说,一个应用程序可以创建多个工作线程来处理完成端口上通知事件。工作线程数量依赖于程序具体需要。

    89590
    领券