在调用程序集中的任何方法之前,CLR 最早调用的入口点是程序集的入口点。程序集的入口点是程序集中 Main 方法的位置,它是程序的起点,是程序开始执行的第一个方法。
在程序集的入口点,CLR 会执行以下操作:
在程序集的入口点之前,CLR 会执行以下操作:
CLR 最早调用的入口点是程序集的入口点,它是程序的起点,是程序开始执行的第一个方法。
程序入口方法 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...而默认域则用储存自身程序集的信息,我们的主程序集就会被加载至这个默认域中,执行程序入口方法,在没有特殊动作外所产生的一切耗费都发生在该域。
; 程序集中有一些托管模块和资源文件,通过CLR处理后在内部得到所有文件的逻辑组合关系,得到一个清单数据块,这些内容描述了组成程序集的文件;注意:程序集中还包含它所引用的其它程序集的一些信息,这些信息可以使程序集实现自描述...,这样也就让CLR的执行不再到注册表中取,因此让程序集的部署要比非托管组件的部署容易得多; 安装VS08,其主要就是CLR的安装,CLR负责管理包含在程序集中的代码执行;系统文件中的mscoree.dll...,CLR在加载程序集的时候江通过这些信息定位到应用程序的入口点方法,这样就启动了应用程序;注意非托管程序如果调用托管程序集,托管程序集DLL的入口函数也会去让CLR来处理包含在其中的代码; mscoree.dll...; CLR不能直接执行IL代码,IL代码还需要通过JIT即时编译器转换成CPU指令; CLR的工作方式:检测代码中引用到的所有类型,分配一个内部数据结构来管理引用类型的访问;当有方法被调用时代码被即时编译验证并转换成...CPU指令,并动态保存在内存中;这样,一个方法只有在首次调用时,才会产生一些性能损失,后续调用时不再进行验证转换,而命令CPU做全速执行。
)后,调用_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
28、CLR与IL分别是什么含义? 29、对象能否调用静态方法? 30、请编写创建一个线程的代码? 1、请解释new与的区别? 在C#中,new关键字可用作运算符和修饰符。 ....; 11、C#中有没有静态构造函数,如果有是做什么用的? 有。静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。...在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。 ...程序集是重用代码的一种方式,通常对应一个工程类库(dll),在一个程序集中可以有属于不同命名空间的类和接口。...28、CLR与IL分别是什么含义?
对于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服务帐户的临时目录。
在引入这个概念之前,前面(上一节)提到程序集时,都是用“文件”这个词来描述的。 程序集的定义只是给编译后生成的文件一个稍微正式一点的名称,对于解释“它是由什么构成的”这个问题并没有太大的帮助。...在了解CLR之前,需要先进一步学习一下程序集,因为下一节会对程序集进行专门的讲述,这里仅简单介绍一下程序集中对于理解CLR有帮助的概念。...CLR会找到程序的入口点,通常是Main()方法,然后执行它。这里又包含了以下过程: 加载类型。在执行Main()方法之前,首先要找到拥有Main()方法的类型并且加载这个类型。...这一步就是将托管的CIL代码编译为可以执行的机器代码的过程,由CLR的即时编译器(JIT Complier)完成。即时编译只有在方法的第一次调用时发生。回想一下,类型加载程序会为每个方法插入一个存根。...在调用方法时,CLR会检查方法的存根,如果存根为空,则执行JIT编译过程,并将该方法被编译后的本地机器代码地址写入到方法存根中。
在.NET项目中,分布式架构对项目的开发也有很大的效率提升。 很多人会问,这些分布式框架的底层原理是什么呢?...该方法将目标AppDomain加载到程序集中,并且执行其主入口点。在父AppDomain种,ExecuteAssembly方法不会加载或者初始化指定的程序集。...ExecuteAssembly是一个同步的例程,这就意味着调用者将被阻塞,直到程序的Main方法把控制权交还运行时。 ...该方法接收三个参数,assemblyFile:包含要执行程序集的文件的名称;assemblySecurity:为程序集提供的证据;args:程序集的入口点的实参。该方法返回 程序集的入口点返回的值。...在实际的项目中,很少直接取操作应用程序域,比较多的是直接操作程序集,所以在本文的最后给出了一个就暗淡的程序集的操作方法。
一、应用程序域AppDomain 在介绍插件技术之前、我们需要先了解一些基础性的知识,第一个就是应用程序域AppDomain. 操作系统和运行时环境通常会在应用程序间提供某种形式的隔离。...在 .NET中应用程序域AppDomain是CLR的运行单元,它可以加载应用程序集Assembly、创建对象以及执行程序。...CLR启用时,会创建一个默认的AppDomain,程序的入口点(Main方法)就是在这个默认的AppDomain中执行。...Assembly不能单独执行,它必须被加载到AppDomain中,然后由AppDomain创建程序集中的类型 及 对象。..."; // 虽然此方法已经被标记为过时方法, msdn备注也提倡不使用该方法, // 但是 以.net 4.0 + win10环境测试,还必须调用该方法 否则,即便卸载了应用程序域 dll 还是未被解除锁定
,在进行互操作的时候,我们需要用DllImport来标识该方法是非托管的代码方法,在编译器编译的时候它能够正确的认识出被该特性标记的是外来代码段,所以能顺利的通过编译,当到达程序运行的时候,也能够正确的认识出该代码是引用非托管的代码...,这样就让我们的CLR去加载非托管DLL文件,然后查找到入口点进行调用;我们拿上一篇文章中的示例来讲吧; [DllImport("Win32DLL.dll", EntryPoint = "add", CharSet...图2: EntryPoint属性是用来确定非托管方法的入口点是什么,在图1中,我的非托管代码的入口点名称是add,也就是说明一个问题,系统在识别非托管代码名称是靠Entrypoint属性来的,而不是我们在...C#编辑器中申明的托管代码的名称AddNumber,系统只用Entrypoint来确定非托管入口点,而我们可以用随意的名称来定义非托管的调用名称,这往往是个好方法,由于我们托管代码经常要讲究一些对象化的编程方法...CallingConvention可选属性; CallingConvention属性也是一个比较重要的属性,在平台调用的过程中起到查找入口点的作用,在托管代码进行非托管代码入口点查找时,会通过CallingConvention
元数据和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 { // 表明程序入口点
IL DASM反编译工具 使用C#的猿人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认识。我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改。...并且它继承自程序集—mscorlib的System.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:为空该指令,主要给外部设备或者指令间隙准备时间
我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改。感觉他还是很强大。 ...并且它继承自程序集—mscorlib的System.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:为空该指令,主要给外部设备或者指令间隙准备时间
两个受保护方法: MemberwiseClone:非虚方法,它创建一个新的类型实例【浅拷贝(共享引用成员)】; Finalize:虚方法,执行垃圾回收之前会调用该方法; 引用类型new的过程: 从托管堆中分配指定类型所需数量的字节来作为其存储对象的内存空间...方法也调用了该字段】; 调用类型的实例构造器【CLR并没有要求调用基类中相应的构造器】 完成上述操作后返回一个指向新创建对象的引用。...2.类型转换 强制类型转换,需要程序员自己负责,如果转换不成功抛出Sysem.InvalidCastException【无效的转换】异常; 隐式类型转换,C#不需要特殊的语法就可以将对象转换为其任何一个基类型...; is,is检查制定对象是否兼容与指定的类型,返回bool; as类型转换,成功返回对象引用,失败返回null; 3.命名空间和程序集 首先CLR没有命名空间的概念,也就是CLR根本就不认识命名空间。...CLR用的是类型的完全限定名,一个程序集中可以存在多个命名空间,一个命名空间下也可以包含多个程序集。
反射 DLL 加载中间 .NET 程序集以处理错误并提高有效负载的稳定性。 中间 .NET 程序集从子进程内的内存中加载您的 .NET 程序集。 您的程序集的主要入口点与您的命令行参数一起被调用。...给定任意 .NET 程序集、参数和入口点(例如 Program.Main),它会生成与位置无关的 shellcode,从内存中加载它。....无论哪种方式,它都会加载到新的 AppDomain 中。在程序集加载之后但在它运行之前,解密的副本将被释放,然后使用 VirtualFree 从内存中释放以阻止内存扫描器。...、一个入口点以及您希望使用的任何参数。...位进程生成相同的 shellcode,请使用“-a”选项: donut.exe -a 1 -f Test.exe -c Test.Program -m Main 您还可以为您指定的任何入口点提供参数。
:父进程是什么权限,此应用程序就是什么权限 requireAdministrator:需要以管理员权限来运行,此类应用程序图标右下方会有个盾牌标记 highestAvailable:此程序以当前用户能获取到的最高权限运行...如果我们在应用程序找到正确的dll之前,将我们自己创造的dll放入优先级更高的搜索目录让应用程序优先加载此dll文件,这就造成了dll劫持。...这个机制简而言之便是可以给CLR提供一个dll,当任何高权限.NET运行时都会主动加载该DLL,我们可以构造恶意dll给CLR加载,从而获得高权限的进程如cmd,从而bypassuac。...以及在注册表,在指定的CLSID属性下新建Inprocserver32项,并写入恶意dll路径. 然后通过mmc调用一下gpedit.msc这种程序,即可以高权限执行dll。...这样写的 // dllmain.cpp : 定义 DLL 应用程序的入口点。
类型转换 CLR最重要的特性之一是安全性,在运行时,通过调用GetType(),总是知道一个对象的确切类型。 CLR允许将一个对象转换为它的实际类型或者它的任何基类型。...命名空间和程序集 在C#中我们使用using引入命名空间,但是CLR并不知道命名空间的任何事,访问一个类型时,CLR需要知道类型的完整名称(长的、包括句点符号的名称)以及该类型的定义具体在哪个程序集中。...默认情况下,C#编译器会自动在MSCorLib.dll程序集中查找“引用的类型”,即使你没有显式的告诉它。...运行时的相互联系 这一节解释类型、对象、线程栈、和托管堆在运行时的相互关系。此外,还将调用静态方法、实例方法和虚方法的区别。 下图展示了CLR的一个Microsoft Windows进程。 ?...然后M1调用M2方法,将局部变量作为一个实参来传递,这造成name变量的地址被压入栈,如下图: ?
在正式开始介绍反射的概念之前,我们先了解一下元数据。 元数据概述 C#代码在经过编译之后会得到二进制格式的程序集,程序集一般是一个.dll或.exe后缀的文件。...CLR头是托管模块所特有的,一般包含以下信息: CLR的版本号, 一些标志 模块的入口方法 强名称数字签名(可选) 元数据是由几个表构成的二进制数据块。...具体包含方法签名和指向方法的IL代码的索引,以及指向方法参数ParamDef的索引。 FieldDef:在程序集中定义的每一个字段都有一个记录项。 具体包含类型,名称以及编译时期确定的静态值等信息。...ParamDef:在程序集中定义的每一个方法参数都有一个记录项。 具体包含类型,名称以及编译时期确定的默认值等信息。 PropertyDef:在程序集中定义的每一个属性都有一个记录项。...EventDef:在程序集中定义的每一个事件都有一个记录项。 具体包含委托的类型,名称等信息。 在编译源代码时,代码定义的任何东西都导致在元数据-定义表中创建一个与之对应的记录项。
在托管程序集中包含元数据和IL(微软的一种中间语言),IL能够访问和操作对象类型,并提供了指令来创建和初始化对象、调用对象上的虚方法以及直接操作数组元素。 ...CLR头是一个小的信息块,主要包含模块在生成是所面向的CLR的major(主)和major(次)版本号;一个标志,一个MethodDef token(指定了模块的入口方法);一个可选的强名称数字签名。...接下来介绍一下在CLR中加载程序集的方法: 在System.Refection.Assembly类的静态方法Load来加载程序集,在加载指定程序集的操作中,会使用LoadFrom()方法,...,然后以一个Syatem.Reflection.AssemblyName对象的形式返回这些信息),LoadFrom方法在内部调用Assembly的Load方法,将AssemblyName对象传给它,CLR...,需要说明的一点是:程序集不提供卸载的功能。
1、通用类型简介 CLR中的一切都围绕类型展开,因为IL是面向对象的高级机器语言.类型向应用程序和其他类型公开了功能.通过类型,用一种编程语言写的代码能与另一种编程语言写的代码沟通.由于类型是...签名指定参数数量(及其顺序).参数类型:方法是否有返回值,如果有返回值,还要指定返回值类型. (3)、属性 对于调用者,属性看起来像是字段.但对于类型的实现者,属性看起来像是一个方法(或者两个方法,get...和set方法).属性允许在访问值之前校验输入参数和对象状态,以及/或者尽在必要时才计算某个值.属性还允许类型的用户采用简化的语法.最后,属性只允许创建只读或只写的"字段". (4)、事件 时间在对象以及其他相关对象之间实现了通知机制...2)、assembly(在C#中使用internal修饰符) 只有在同一个程序集中的代码才能看见并访问该类型. (3)、private 被private修饰的成员智能由同一个类型中的其他成员访问 (4)...、family(在C#中使用protected修饰符) 成员可由派生类型访问,不管那些类型是否在同一程序集中 (5)、protected internal 成员只能由同一程序集中的任何类型来访问.
线程(Thread)是进程中的基本执行单元,在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。...内核模式栈,当调用内核API时会使用 DLL线程连接和分离通知,windows每创建一个线程就会加载所有DLL中的入口方法,并传递一个dll_thread_attach的方法,当加载dll很多是,这个操作会造成很大的性能消耗...CLR初始化时,线程池中是没有线程的,其内部维护了一个操作请求队列,应用程序想执行一个异步操作时,就调用某个方法,将一个记录项(entry)追加到线程池的队列中。...由于线程可以在finally块中执行未绑定计算或调用Thread.ResetAbort来取消中止,所以不能保证线程将完全结束。如果您希望一直等到被中止的线程结束,可以调用Thread.Join方法。...一个socket被创建后,可以在任何时刻和一个完成端口联系起来。 一般来说,一个应用程序可以创建多个工作线程来处理完成端口上的通知事件。工作线程的数量依赖于程序的具体需要。
领取专属 10元无门槛券
手把手带您无忧上云