[CLR via C#]1.3 加载公共语言运行时】的更多相关文章

原文:[CLR via C#]1.3 加载公共语言运行时 1. 你生成的每个程序集可以是EXE,也可以是DLL.最终都是有CLR管理这些程序集中代码的执行. 2. VS2010中,创建新的EXE项目时,默认平台是x86,而不是anycpu.   3. Windows的64位版本提供了一个名为WoW64(Windows on Windows64)的技术,允许允许32位的Windows程序.这是因为这个技术能模拟x86的指令集,但这样会显著影响性能.   4. 编译目标平台对生成的模型的影响以及运行…
本章主要讨论在编译时对一个类型一无所知的情况下,如何在运行时发现类型的信息.创建类型的实例以及访问类型的成员.可利用本章讲述的内容创建动态可扩展应用程序. 反射使用的典型场景一般是由一家公司创建宿主应用程序,其他公司创建加载项(add-in)来扩展宿主应用程序.宿主不能基于一些具体的加载项来构建和测试,因为加载项由不同公司创建,而且极有可能是在宿主应用程序发布之后才创建的. 程序集加载 我们知道,JIT编译器将方法的IL代码编译成本机代码时,会查看il代码中引用了哪些类型.在运行时,jit编译器…
Windows 运行时   编译器使用 COM 引用计数机制来确定对象是否不再使用并可以删除. 因为从 Windows 运行时接口派生的对象实际上是 COM 对象,所以这是可行的. 在创建或复制对象时,引用计数会递增:当对象设置为 null 或超出范围时,引用计数会递减. 如果引用计数归零,将立即自动删除对象. 句柄声明符的优点在于,在 COM 中,您必须以显式方式管理对象的引用计数,而这个过程单调乏味又容易出错. 也就是说,要递增或递减引用计数,必须调用对象的 AddRef() 和 Relea…
执行2变一下代码   : 注意:1表示启用,0表示禁用. sp_configure ; GO sp_configure ; GO sp_configure ; go RECONFIGURE; GO EXEC sp_configure;…
六星经典CSAPP-笔记(7)加载与链接 1.对象文件(Object File) 1.1 文件类型 对象文件有三种形式: 可重定位对象文件(Relocatable object file):包含二进制代码和数据,能与其他可重定位对象文件在编译时合并创建出一个可执行文件. 可执行对象文件(Executable object file):包含可以直接拷贝进行内存执行的二进制代码和数据. 共享对象文件(Shared object file):一种特殊的可重定位对象文件,能在加载时或运行时,装载进内存进…
CLR中的程序集加载 本次来讨论一下基于.net平台的CLR中的程序集加载的机制: [注:由于.net已经开源,可利用vs2015查看c#源码的具体实现] 在运行时,JIT编译器利用程序集的TypeRef和AssemblyRef元数据表来确定哪一个程序集定义了所引用的类型.在AssemblyRef元数据表的记录项中,包含构成程序集的强名称的各个部分.JIT编译器获取包括名称(无扩展名和路径).版本.语言文化和公钥标记,将这些连接成一个字符串.JIT编译器将该标识匹配的一个程序集加载到AppDom…
当运行Windows应用程序的时候,CLR总是默默地为服务着.CLR到底是如何被加载并运行呢? 首先,Microsoft专门为CLR定义了一个标准的COM接口. 安装某个版本的.NET Framework,CLR被包含在DLL中,作为COM服务器在Windows注册表中注册. 一台电脑上可能安装多个版本的CLR.打开开发人员命令提示,输入CLRVer.exe,可以看到当前电脑上安装的CLR版本. 比如,在C:\Windows\Microsoft.NET\Framework\v2.0.50727文…
PC 硬件 本文介绍供 x86 运行的个人计算机(PC)硬件平台. PC 是指遵守一定工业标准的计算机,它的目标是使得不同厂家生产的机器都能够运行一定范围内的软件.这些标准随时时间迁移不断变化,因此90年代的 PC 与今日的 PC 看起来已是大不相同. 从外观来看,PC 是一个配置有键盘.屏幕和各种设备的"盒子".盒子内部则是一块集成电路——主板,上面有 CPU 芯片,内存芯片,显卡芯片,I/O 控制器芯片,以及负责芯片间通信的总线.总线会遵守某种标准(如 PCI 或 USB),从而能…
转载自:http://www.linuxidc.com/Linux/2012-10/72293.htm 机制介绍 有些时候主程序是通过C/C++实现的,但是我们希望通过托管代码来扩展非托管程序,从而也获得托管代码带来的一系列优点.比如开发效率高,自动垃圾回收等. 运行托管与非托管代码根本区别在于托管代码是进程首先加载CLR然后通过CLR运行托管程序,而非托管代码则是操作系统直接根据其PE Header加载程序分配内存从而运行.因此如果需要通过托管代码来扩展非托管程序,首先要加载CLR来使非托管程…
#1 加载程序集 Assembly.Load: public class Assembly { public static Assembly Load(AssemblyName assemblyRef); public static Assembly Load(String assemblyString); } 在内部,Load导致CLR向应用程序集应用一个版本绑定重定向策略,并在GAC中查找程序集.如果传递的是一个弱命名程序集,不会应用版本绑定重定向策略,也不会去GAC中查找程序集. AppD…
最近产品环境出现了部分服务器当机情况,虽然重启之后问题就不出现了.但本着彻底解决问题的态度,想要找到root cause.多次尝试Visual Studio失败(可能是代码惊醒了优化和签名)之后,决定使用WinDBG来调试.于是...灾难发生了. 想要一次性成功搭建测试环境,那得靠人品.看来我近来人品积累的不够,不断的有小问题出现.比如加载SOS和CLR,就让我不胜其烦.必须得记下来,分享出来,以节省大家的时间. 问题一:WinDBG分X86和X64两个版本 如果你用的是32位的WinDBG,那…
WinDBG中加载SOS和CLR 最近产品环境出现了部分服务器当机情况,虽然重启之后问题就不出现了.但本着彻底解决问题的态度,想要找到root cause.多次尝试Visual Studio失败(可能是代码惊醒了优化和签名)之后,决定使用WinDBG来调试.于是...灾难发生了. 想要一次性成功搭建测试环境,那得靠人品.看来我近来人品积累的不够,不断的有小问题出现.比如加载SOS和CLR,就让我不胜其烦.必须得记下来,分享出来,以节省大家的时间. 问题一:WinDBG分X86和X64两个版本 如…
1.CLR首次加载代码造成的性能损失 四.CLR执行程序集中代码介绍了CLR在首次执行一个类的时,会初始化一个内部结构,然后当目标方法被首次调用时,JITComplier函数(JIT编译器)会验证IL代码并将IL代码编译成本地CPU指令并存储到动态内存中,这意味着一旦应用程序终止,编译好的代码也会被丢弃,所以,当再次运行应用程序,或者同时启动应用程序的两个实例(使用两个不同的操作系统的进程),JIT编译器必须再次将IL编译成本机指令.对于某些应用程序,这可能会增加内存的负担. 相比之下,本机(n…
在项目的配置文件Web.config中,会看到<runtime>节点,以及包含在其中的<assemblyBinding>节点,这显然与程序集有关,这些节点到底何时被用到呢? 在默认情况下,在运行时,JIT编译器将IL代码编译成本地代码时,会查看IL代码中的字段.局部变量.方法参数等引用了哪些类型,然后借助程序集的TypeRef和AssemblyRef元数据,内部使用System.Reflection.Assembly的Load方法来确定需要被加载的程序集,包括module. Loa…
WinDbg调试.net2.0和.net4.0程序有所不同,因为.net4.0使用新版本的CLR.例如: mscoree.dll 变为 mscoree.dll 和 mscoreei.dll, mscorwks.dll 变为 clr.dll, mscorjit.dll 变为 clrjit.dll. 因此,在.net2.0加载mscorjit.dll时断点:sxe ld:mscorjit(卸载是sxe ud:mscorjit), 在.net4.0加载clrjit.dll时断点:sxe ld:clrj…
查看,clr via c# 程序集加载和反射(1) 8,发现类型的成员: 字段,构造器,方法,属性,事件,嵌套类型都可以作为类型成员.其包含在抽象类MemberInfo中,封装了所有类型都有的一组属性. MemeberInfo的派生列表: System.Reflection.MemberInfo    System.Reflection.EventInFo System.Reflection.FieldInfo    System.Reflection.MethodBase          …
前言: 很多书籍或者很多文章,对于CLR或者GC这块只限于长篇大论的理论性概念,对于里面的如何运作模式,却几乎一无所知.高达近百万行的CPP文件,毕竟读懂的没有几个.以下取自CLR.Net 6 PreView版本 分配量超过阈值 GC触发里面有一个GC被触发的条件是,分配的内存块超过阈值.这个阈值是在Generation代里面的static_data里面的存储的固定数值.当你分配的内存块超过这个阈值的时候,就会触发GC进行垃圾回收.来看看这个阈值动态加载和超过阈值触发GC垃圾回收之后,重新计算阈…
前言 本文翻译自BotR中的一篇,原文链接 Type Loader Design ,可以帮助我们了解CLR的类型加载机制(注意是Type类型,而不是Class类),文中涉及到术语或者容易混淆的地方,我有在随后的括号里列出原文和解释.如有翻译不正确的地方,欢迎指正. 文章内容偏底层,有很多琐碎的概念,后面有机会我会一一写文章介绍. 类型加载器设计 作者: Ladi Prosek - 2007 翻译:几秋 (https://home.cnblogs.com/u/netry/) 介绍 在一个基于类的(…
1,程序集加载---弱的程序集可以加载强签名的程序集,但是不可相反.否则引用会报错!(但是,反射是没问题的) //获取当前类的Assembly Assembly.GetEntryAssembly() //通过Load方法加载程序集 Assembly.Load //通过LoadFrom加载指定路径名的程序集--可以时url对象. Assembly LoadFrom(string path) //只是反射,并确保程序集中的数据不被执行. ReflectionOnlyLoadFrom() Reflec…
开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集 其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了…
最近在对AppDomain编程时遇到了一个问题,卸载AppDomain后,在内存中还保留它加载的DLL的数据,所以即使卸载掉AppDomain,还是无法更新它加载的DLL.看来只有关闭整个进程来更新DLL了. -------------------------------------------------------------------------------------------------------------- 我们知道,进程是操作系统用于隔离众多正在运行的应用程序的机制.在.N…
解决方案: 在app.config新增如下配置节: <?xml version="1.0"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/> </…
在把以前写的代码生成工具从原来的.NET3.5升级到.NET4.0时,将程序集都更新后,一运行程序在一处方法调用时报出了一个异常: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集 其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了一个问题,就是现有的System.Data.Sqlite这个数据…
本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52063666 近日,我们EasyDarwin团队在调试EasyDarwin的时候遇到有些C++源文件无法命中断点,提示"当前不会命中断点.还没有为该文档加载任何符号". 这里是因为,有些源文件的调试信息被禁用了,生成不了调试符号.只需要将源文件的"调试信息格式"设置一下就可以了. 调试信息格式说明 /Z7./Zi…
一.概述 使用.NET建立的可执行程序 *.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.在一个进程中可以包含多个应用程序域,一个应用程序域可以装载一个可执行程序(*.exe)或者多个程序集(*.dll),这样可以使应用程序域之间实现深度隔离,即使进程中的某个应用程序域出现错误,也不会影响其他应用程序域的正常运作.处理asp.net所涉及的类大多数定义在System.Web程序集中. 当exe程序集加载完毕,.Net会在当前进程中创建一个默认应用程序域,这个应…
最近需要完成一个API,通过用户上传的经纬度判断用户的所在县市省,数据量相对不是很大所以把相关数据全部扔到了内存里知行,主要用到了SqlGeometry, 代码写完后运行本地没问题,扔到服务器上开始报异常“无法加载sqlserverspatial.dll”,一时蛋疼菊紧.难道还得装个sql server的服务吗...显然不用- -留下点笔记以备后用.. Any application that uses Entity Framework’s spatial data type support t…
程序集加载 程序集加载,CLR使用System.Reflection.Assembly.Load静态方法,当然这个方法我们自己也可以显式调用. 还有一个Assembly.LoadFrom方法加载指定路径名的程序集,实际上其内部是先通过AssemblyName.GetAssemblyName获取AssemblyName对象,然后调用Assembly.Load方法. 此时load方法会在各个位置(前面03章讲过)查找程序集,如果已经加载了此程序集就返回已加载的程序集,如果没有加载就去加载找到的程序集…
在开始本文之前先提两个疑问: 1.一个.Net程序依赖很多的dll,那个他们是在应用程序启动的时候全部把所依赖的动态库全部都加载到应用程序域中的呢还是有选择的加载呢? 2.当应用程序已经启动后我们动态加载程序集的话,那么该程序集所依赖的程序集是全部加载还是按需加载呢? 一.分析第一个问题: 创建三个工程ConsoleApplication1是控制台工程,依赖于类库ClassLibrary1,而ClassLibrary1又依赖于ClassLibrary2工程. 实验1:ConsoleApplica…
使用windbg 加载sos.dll时,经常碰到报The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll) failed, Win32 error 0n193这样的错误,按照提示,应该为加载的dll版本不对造成的.应该是因为在x64环境下,加载了X86的版本.指定路径加载.load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll,发现OK…
本博客中以“C#.Net 如何动态加载与卸载程序集(.dll或者.exe)”开头的都是引用莫问奴归处 微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有一把,若要获得还需要你费一些心思.我在学习Remoting的时候,就遇到一个扰人的问题,就是Remoting为远程对象仅提供Register的方法,如果你要注销时,只有另辟蹊径.细心的开发员,会发现Visual Studio.Net中的反射机制,同样面临这个问题.你可以找遍MSDN的所有文档,在Assembly类中,你…