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

加载新的托管应用程序时,是否每次都加载并初始化CLR?

当加载新的托管应用程序时,CLR(公共语言运行时)不会每次都加载并初始化。CLR是一个运行时环境,用于执行.NET应用程序。当第一个托管应用程序加载时,CLR会被初始化并启动。之后,当加载新的托管应用程序时,CLR会在同一个进程中运行,而不会再次加载并初始化。

然而,如果应用程序是通过不同的应用域加载的,那么每个应用域将在其自己的运行时环境中运行,这意味着每个应用域都需要加载并初始化CLR。

总之,加载新的托管应用程序时,CLR只会在第一次加载时初始化,之后的应用程序将在同一个运行时环境中运行,除非它们是通过不同的应用域加载的。

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

相关·内容

四、CLR执行程序集中代码和IL代码简介

位和64位版本.当add指令执行时,它判断栈中操作数类型,执行恰当操作. (3)、IL指令最大优势 IL最大优势并不是对底层抽象,而是应用程序健壮性和安全性.将IL编译成本机CPU指令...应用程序完全可能读写无效内存地址。将每个Windows进程放到独立地址空间,将获得健壮性和稳定性,一个进程干扰不到另一个进程....通过验证托管代码,可以确保代码不会不正确地访问内存,不会干扰另一个应用程序代码.这样就可以放心地将多个托管应用程序放到同一个Windows虚拟地址空间运行。...CLR提供了在一个操作系统进程中执行多个托管应用程序能力,每个应用程序都在一个AppDomain中执行,每个托管Exe文件默认都在它自己独立地址空间中运行,这个地址空间已有一个AppDomain....PEVerify检查程序集,它必须能够定位加载应用所有的程序集.

1.3K80

字符串留用与字符串池

1、关于字符串操作对应用程序性能影响 字符串相等性检查是应用程序常见操作,于此同时,这也是一种严重损害性能操作.执行序号(字符串二进制)相等行检查,CLR会进行以下操作: 1、判断字符串长度是否相等...将相同字符串变量引用指向一个字符串对象. 3、CLR实现字符串留用过程 CLR初始化时会创建一个内部哈希表.在这个表中,键(key)是字符串,而值(value)是对托管堆中String对象引用...4、CLR默认留用程序集元数据中字面值字符串 程序集加载,CLR默认留用程序集元数据中描述所有字面值字符串,大微软知道这个过程可能因为额外哈希表查找而显著影响性能,所以现在可以禁用此功能.通过对程序集用...,及显示留用指定字符串 由于CLR4.5及以上选择忽略4中特性,所以程序集加载到AppDomain中,CLR会对该程序集中元数据中所描述所有字面值字符串.代码如下: String str = "xiaochao...,并在托管模块中元数据中嵌入.同一个字符串在源代码中多次出现,如果每次都去内存中重复开辟空间,不仅浪费内存,而且把它们嵌入元数据会使生成文件无谓增大.

77620
  • UnmanagedPowerShell工具分析

    其实也就是说使用具有注入功能程序将一个非托管C++DLL注入到目标进程中,然后该非托管DLL启动CLR加载要执行托管DLL,最后调用CLR执行托管代码。...而我们下面的工具实现是非托管进程启动CLR加载要执行托管程序集,最后调用CLR执行托管代码 下面就对UnmanagedPowerShell工具源码来解释下整个流程工作运转 关于PowerShellRunner.cs...//每次启动管道,运行空间都会将线程当前ui区域性设置为这个值。...因此如果需要通过托管代码来扩展非托管程序,首先要加载CLR来使非托管程序获得运行托管代码能力。...,分配和初始化该数组数据,返回一个指向数组描述符指针 //VT_UI1 type property MUST be a 1-byte unsigned integer SAFEARRAY* arr

    2.5K10

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

    一旦加载CLR,shellcode 就会创建一个应用程序域。此时,必须获取 .NET 程序集有效负载。如果用户提供了暂存 URL,则会从中下载程序集。否则,它是从内存中获取。...最后, 如果 CLR 已经加载到宿主进程中,那么 donut shellcode 仍然可以工作。.NET 程序集将被加载托管进程内应用程序域中。....一次性应用程序域 当 donut 加载一个程序集,它会将它加载到一个 AppDomain 中。...误报:这不会注意到将 .NET 代码注入到已加载 CLR 进程中。因此,不要使用反射 API,也不要在使用 donut 将 shellcode 注入托管进程使用。...因此,我们观察它们加载,然后检查加载它们程序是否是有效 .NET 程序集。

    2K00

    .NET6 平台系列3 .NET CLR 详解

    使用 ASP.NET Web Form 开发应用程序,部署到IIS服务器,不同CLR版本需要选择不同托管管道模式。 CLR 构成 CLR主要由以下11个功能器件组成。...(1)类加载器(Class Loader):将应用程序汇编加载到内存中。...(7)类型检查器(Type Checker):检查禁止非安全类型转换以及未初始化变量使用。...当执行应用程序时,首先类加载器将应用程序汇编(MSIL代码和元数据)加载到内存中,然后使用其中元数据加载任何应用程序所需要组件支持汇编并进行类型安全和版本检查。...(3)CLR 并不是将应用程序所有MSIL代码翻译成CPU指令代码,仅当用户需要运行一个托管应用程序时,操作系统装载器才加载 CLR,这时CLR 才开始翻译该应用MSIL代码。

    76220

    CLR和.Net对象生存周期

    垃圾回收器释放未被引用对象,并回收它们内存。 结合托管堆,.Net已经为开发人员提供了一个很简便编程模型:分配初始化内存直接使用。大多数类型并不需要我们进行资源清理,GC会自动释放内存。...GC碎片整理阶段 所有的根对象检查完之后,GC构建对象图中就有了应用程序中所有的可达对象。托管堆上所有不在这个图上对象就是要做回收垃圾对象了。...CLR初始化时为第0代对象选择一个预算容量,假如这时分配一个对象造成第0代超过预算,此时CLR就会触发一次GC操作。比如说A-H对象正好用完了第 0 代空间,此时再操作就会引发一次GC操作。...Tips:垃圾回收发生于第 0 代满时候 每次对象仍然会被分配到第 0 代中,如下图所示,CLR又重新分配了I-N对象,一段时间后,第 0 代和第 1 代产生了垃圾对象 ?...疾射此时CLR再为第 0 代对象加入对象造成超过第 0 代预算情况,GC将重新开启。

    1.1K50

    CLR和.Net对象生存周期

    垃圾回收器释放未被引用对象,并回收它们内存。 结合托管堆,.Net已经为开发人员提供了一个很简便编程模型:分配初始化内存直接使用。大多数类型并不需要我们进行资源清理,GC会自动释放内存。...GC碎片整理阶段 所有的根对象检查完之后,GC构建对象图中就有了应用程序中所有的可达对象。托管堆上所有不在这个图上对象就是要做回收垃圾对象了。...CLR初始化时为第0代对象选择一个预算容量,假如这时分配一个对象造成第0代超过预算,此时CLR就会触发一次GC操作。比如说A-H对象正好用完了第 0 代空间,此时再操作就会引发一次GC操作。...Tips:垃圾回收发生于第 0 代满时候 每次对象仍然会被分配到第 0 代中,如下图所示,CLR又重新分配了I-N对象,一段时间后,第 0 代和第 1 代产生了垃圾对象 ?...疾射此时CLR再为第 0 代对象加入对象造成超过第 0 代预算情况,GC将重新开启。

    82560

    CLR via C#》笔记:第4部分 核心机制(3)

    寄宿(hosting)使任何应用程序都能利用CLR 功能。特别要指出是,它使现有的应用程序至少能部分使用托管代码编写。另外,寄宿还为应用程序提供了通过编程来进行自定义和扩展能力。...CLR初始化时创建第一个AppDomain称为“默认AppDomain”,这个默认AppDomain只有在Windows进程终止才会被销毁。...寄宿了CLR两个AppDomain一个Windows进程示意图: 两个AppDomain加载了System.dll程序集。...反射性能 反射是相当强大机制,允许在运行时发现使用编译还不了解类型及其成员。但是,它也有下面两个缺点:(P521 1) 1、反射造成编译无法保证类型安全性。 2、反射速度慢。...封装了类型成员信息反射类型层次结构 查询类型成员显示成员信息,代码示例(P530 last) 调用类型成员(P533-P537) 使用绑定句柄减少进程内存消耗:许多应用程序绑定了一组类型(

    83310

    .NET6 平台系列3 .NET CLR 详解

    使用 ASP.NET Web Form 开发应用程序,部署到IIS服务器,不同CLR版本需要选择不同托管管道模式。 ? ? CLR 构成 CLR主要由以下11个功能器件组成。 ?...(1)类加载器(Class Loader):将应用程序汇编加载到内存中。...(7)类型检查器(Type Checker):检查禁止非安全类型转换以及未初始化变量使用。...当执行应用程序时,首先类加载器将应用程序汇编(MSIL代码和元数据)加载到内存中,然后使用其中元数据加载任何应用程序所需要组件支持汇编并进行类型安全和版本检查。...(3)CLR 并不是将应用程序所有MSIL代码翻译成CPU指令代码,仅当用户需要运行一个托管应用程序时,操作系统装载器才加载 CLR,这时CLR 才开始翻译该应用MSIL代码。

    2.7K21

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

    AOT编译 CLR内嵌编译器是即时性,这样一个很明显好处就是可以根据当时本机情况生成更有利于本机优化代码,但同样每次在对代码编译需要一个预热操作,它需要一个运行时环境来支持...强名称程序集是先找到与程序集名称(VS中对项目右键属性应用程序->程序集名称)相等文件名称,然后 按照唯一标识再来确认,确认后CLR加载程序集,同时会通过公钥效验该签名来验证程序集是否被篡改...,而mscorlib.dll又由于其地位特殊,早在CLR初始化时候就已经被类型加载器自动加载至内存中,所以这行代码可以直接在内存中读取到类型方法信息。...系统程序域里维持着一些系统构建项,我们可以通过这些项来监控管理其它应用程序域等。共享域存放着其它域都会访问到一些信息,当共享域初始化完毕后,会自动加载mscorlib.dll程序集至该共享域。...当我们想让程序在不关闭不重新部署情况下添加一个功能或者改变某一块功能,我们可以这样做:将程序主模块仍默认加载至默认域,再创建一个应用程序域,然后将需要更改或替换模块程序集加载至该域,每当更改和替换时候直接卸载该域即可

    4.5K30

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

    AOT编译 CLR内嵌编译器是即时性,这样一个很明显好处就是可以根据当时本机情况生成更有利于本机优化代码,但同样每次在对代码编译需要一个预热操作,它需要一个运行时环境来支持,这之间还是有消耗...CLR在查找引用程序集位置时候,第一个判断条件是 判断该程序集是否被签名。 什么是签名? 强名称程序集 就比如大家叫张三,姓名一样,喊一声张三不知道到底在叫谁。...,而mscorlib.dll又由于其地位特殊,早在CLR初始化时候就已经被类型加载器自动加载至内存中,所以这行代码可以直接在内存中读取到类型方法信息。...系统程序域里维持着一些系统构建项,我们可以通过这些项来监控管理其它应用程序域等。共享域存放着其它域都会访问到一些信息,当共享域初始化完毕后,会自动加载mscorlib.dll程序集至该共享域。...当我们想让程序在不关闭不重新部署情况下添加一个功能或者改变某一块功能,我们可以这样做:将程序主模块仍默认加载至默认域,再创建一个应用程序域,然后将需要更改或替换模块程序集加载至该域,每当更改和替换时候直接卸载该域即可

    2.7K63

    .NET工作准备--04ASP.NET

    net宿主概念,ISAPI概念,ASP.NET基本运行机制; .net宿主概念:CLR被实现为一个标准COM服务器组件,CLR具有标准COM接口和接口GUID,在安装.netCLR作为一个...COM服务器在OS内注册;可以使用vs自带oleview查看;CLR实际可以被非托管代码加载使用; 理解难度很大,加油endeavor ISAPI是什么?...是一个宿主在CLRISAPI过滤器程序;ISAPI->ASP.NET->托管代码机制很复杂,简要说明: asp.net初始运行,加载CLR; iis接受一个http请求,并且判断出该请求应该被绑定到...处理; 当网站文件动态更新,将重新加载应用程序域; *常见httpCode有哪些?...分4个步骤: 初始化:PreInit,Init, InitComplete--包含初始化类对象,初始化主题页面等特性,判断是否是第一次访问页面等初始功能; 加载数据和页面:LoadState, ProcessPostData

    2K50

    使用 ETW 对 .NET 应用程序进行性能诊断

    本文旨在使您了解使用 ETW 分析托管应用程序好处。我不会介绍所有内容 - 有几个可用于诊断 OS 事件和 CLR ETW 事件在本文中不会提到。...但是,以后经常会出现在循环中停止调用此方法情况,导致应用程序性能下降。 在 CSV 文件中,由于所有行格式相同,因此没有必要每次这样做。....NET Framework 4 中 CLR ETW 事件 CLR 团队撰写了一篇有关跟踪 DLL 加载确定启动期间是否需要加载特定 DLL 博客文章。...通过使用 ETW 事件,可使确定是否需要在启动期间进行 DLL 加载过程变得更加简单。...通过下载 PerfMonitor、使用 CLR ETW 事件 MSDN 文档阅读 CLR Perf 博客,您可以快速开始对托管应用程序进行性能调查。

    1.4K60

    五、CLR加载程序集代码,JIT编译器对性能产生影响

    1、CLR首次加载代码造成性能损失      四、CLR执行程序集中代码介绍了CLR在首次执行一个类,会初始化一个内部结构,然后当目标方法被首次调用时,JITComplier函数(JIT编译器)...相比之下,本机(native)应用程序只读代码页可由应用程序正在运行所有实例共享. 2、CLR首次加载代码造成性能损失严重程度 对于大多数应用程序,JIT编译造成损失并不严重,大多数应用程序都在反复调用相同方法...应用程序运行期间,这些方法只会对性能造成一次性影响.除此之外,在方法内部花费时间可能比花在首次调用方法,JIT编译和优化IL所花费时间更多. 3、CLR加载代码JIT编译器进行代码优化 CLR...首次加载程序集代码,JIT将IL编译成本地代码,会对其进行代码优化,这类似与非托管C++编译器后端所做事情.这可能也会花费加多时间生成优化代码. ?...与本机代码联系(无论编译器开关设置是什么)除非在Visual Stdio中关闭了"在模块加载时取消JIT优化(权限托管)"操作步骤如下: 工具-选项-调试 ?

    94070

    C#代码是怎么跑起来(二)

    _CorExeMain()开始执行,选择加载合适版本CLRCLR开始运行,CLR运行时会分配一个连续地址空间用作托管堆,并用一个指针NextObjPtr指到开始位置,下次分配内存就从指针指位置开始...CLR运行后从CLR头里找到应用程序入口标识,也就是Main()方法MethodDefToken,通过这个标识在元数据表MethodDef里找到Main方法偏移位置,这样就可以找到Main()IL...CLR检查Main方法里面是否有没加载类型,没有的话就加载进来并在托管堆上建一个类型对象,类型对象包含静态字段,方法,基类引用。...CLR会给托管堆上每个对象包括对象类型添加两个字段,一个对象类型指针,一个同步块索引。...垃圾回收标识,GC触发首先认为所有的对象都是垃圾,由局部变量,寄存器,静态变量这些根向上找,凡是包含对象认为还有引用,在同步块索引上修改一位标识,当所有对象遍历过后没有标识对象就会被清掉,

    1.1K90

    CLR via C#》笔记:第4部分 核心机制(2)

    3、CLR检查区域中是否有分配对象所需字节数。 托管堆在内存中连续分配对象,所以会因为引用“局部化”(locality)而获得性能上提升。...3、回收堆一部分,速度快于回收整个堆。 托管堆在初始化时不包含对象。添加到堆对象称为第0代对象。简单地说,第0代对象就是那些构造对象,垃圾回收器从未检查过它们。...下图展示了一个启动应用程序,它分配了5个对象(从A到E)。过了一会儿,对象C和E变得不可达。(P454 – P457) CLR初始化时为第0代对象选择一个预算容量(以KB为单位)。...应用程序继续运行,分配了对象F到对象K。另外,随着应用程序继续运行,对象B,H和J变得不可达,它们内存将在某一刻回收。 现在,假定分配对象L会造成第0代超出预算,造成必须启动垃圾回收。...开始垃圾回收,垃圾回收器在每个CPU上运行一个特殊线程;每个线程和其他线程并发回收它自己区域。对于工作者线程(worker thread)行为一致服务器应用程序,并发回收能很好地进行。

    57910

    Windows开机过程和测试方法探索

    PreSMSS WinLoad.exe调用内核,初始化内核,启动 PnP 管理器检查设备,加载初始化设备驱动程序 SMSSInit 这个阶段是控制权从内核阶段移交给Smss.exe(session manager...进程),主要初始化视频驱动启动子系统Smss.exe, Csrss.exe, Wininit.exe, Winlogon.exe。...开机完成后 应用程序自启动逻辑是否影响到开机后操作。...; 服务启动代码避免用托管代码(CLR); 【性能点】: 是否开机启动服务,评估开机服务会增加多少开机时间 2)驱动 【开发设计原则】: 驱动尽量用WDF编写; 开机启动驱动签名是Embedded_sign...【性能点】: 是否是开机驱动,会增加多少开机时间 3)应用程序 【开发设计原则】: 自启动应用,应减少对开机资源消耗(规范其启动后对于DISK和CPU占用); 应用程序启动代码避免用托管代码

    2.5K100

    六、CLR托管代码应用程序与非托管代码程序之间性能对比

    1、托管程序二次编译问题,以及微软做优化 五、CLR加载程序集代码,JIT编译器对性能产生影响中介绍了CLR托管应用程序二次编译对性能产生影响.事实上,在IL编译成本机代码时候时候...但是,在微软做了大量性能优化工作之后,将这些额外开销保持在最低限度之内. 2、托管程序实际性能 事实上,托管程序性能实际上要比非托管应用程序要好,举个例子,当JIT编译器在运行时将IL代码编译器编译成本机代码时候...如果JIT编译器没有使托管应用程序达到应有的效果,如果需要进一步确认,有两种方法: (1)、.Net Framework SDK提供NGen.exe工具 该工具将程序集所有的IL代码编译成本机代码,...并将这些本机代码保存到一个磁盘文件中,在运行时加载程序集,CLR自动判断是否存在该程序集预编译版本。...如果是,CLR加载预编译版本. 注:NGen.exe对最终执行环境预设是很保守,所以,NGen.exe生成代码不会像JIT编译器生成代码那样进行高度优化。

    90340

    关于CLR内存管理一些深层次讨论

    从与程序集关系来讲,我们可以将应用程序域看成是加载程序集容器。只有相关程序集被CLR加载到相应应用程序域中,才谈得上代码执行。 基于应用程序隔离,归根结底是内存隔离。...系统程序域一个主要任务是追踪其他所有应用程序状态,负责加载和卸载它们; 共享程序域:共享程序域主要用于保存以“中立域(Domain-neutral Domain )”加载程序集容器。...所谓“中立域 ”方式加载程序集,就是说程序集并不被加载到当前程序域中被该程序域专用,而是加载到一个公共程序域中被所有程序域共享。...从某种意义上讲,在字符串驻留机制下,字符串也是以“中立域”方式被加载,被驻留字符串能够被同一个进程下所有应用程序域所共享。 那么,我们是否可以通过一些比较直观方式来验证这一点。...四、程序集加载方式 ? ? 虽然我们说CLR在启动托管应用时候,以中立域方式加载msCorLib.dll这个程序集,但是这不是程序集默认采用加载方式。

    66790

    原 Type System Overvie

    GetMethod/FieldDesc: 用于查找读取类型字段 Virtual Stub Dispatch: 用来查找调用虚方法桩 还有很多辅助数据解构和算法用于向CLR其他部分提供信息。...每次加载加载最少给定类型. 系统数据必须存储再NGEN镜像中 ....非目标 所有元数据信息直接反映在CLR数据结构中 所有的反射接口很快 托管代码运行时使用算法设计 类型系统中强制转换算法是个经典算法,在托管代码中经常使用。...一个对象能否转换成特定非等效数组 对象能否转换成一个非泛型接口 能否转换成数组 能否转换成任意托管类型 除了最后一个其他实现进行了优化以获得更好性能,然而这是以牺牲代码一致性为代价。...ngen镜像在加载后,数据结构是完全正确,这个优化要求ngen镜像和它依赖程序集之间存在硬边界,查看NGEN文档可以获得更细节描述。 类型系统和程序集加载 类型系统是应用程序加载核心部分。

    90280
    领券