<<展现C#>> 第二章 NGWS Runtime 技术基础(修订)

Windows Runtime via C# 立即下载

 

 

                 第二章  NGWS  runtime 技术基础

 

    既然你已经具有了C#全面的印象,我也想让你领略NGWS runtime的全貌。C#依靠由NGWS提供的运行时;因此,有必要知道运行时如何工作,以及它背后所蕴含的概念。

    所以,这一章分为两部分——它们是所有的概念和应用的基础。两部分的内容虽然有些重叠,但有助于加深理解正在学习的内容。

 

2.1  NGWS  Runtime

    NGWS和NGWS Runtime为你提供了一种运行时环境。该运行时管理执行代码,并提供了使编程更容易的服务。只要你的编译器支持这种运行时,你就会从这种受管理的执行环境中得益。

    你猜测C#编译器支持NGWS runtime很正确,但是不仅它支持NGWS runtime,VB和C++也支持。这些为支持运行时所创建的代码称作“受管代码”(managed code)。以下是你的应用程序从NGWS runtime那里所得到的利益:

 

    ·跨语言平台集成(通过通用语言规范)

    ·自动内存管理(垃圾收集)

    ·跨语言平台异常处理(统一展开)

    ·增强安全(包括类型安全)

    ·版本支持("DLL地狱"终结者)

    ·组件交互简化模式

 

    因NGWS runtime提供了所有的这些益处,编译器必须把元文件和受管代码一起发出。元文件描述代码中的类型,它和你的代码存在一起(与PE类似---PE为可变位执行文件)

    正如你从很多种跨语言平台功能所看到的,NGWS runtime主要是一种高度集成的、跨越多种不同语言的平台。这种支持甚至允许你从一个VB对象派生出一个C#类(我后面会给出要讨论的文章)。

    C#程序员将会喜欢的一个功能是,他们不必担心内存管理——也就是说不必担心臭名昭著的内存泄漏。NGWS  runtime提供了内存管理,当对象和变量的生命期结束(不再被引用)时,垃圾收集器释放它们。我真的喜欢这个功能,因为在COM中的内存管理一直是我的一块心病。

    应该鼓励配置一个管理应用程序或者组件。因为管理应用程序含有元数据文件,NGWS runtime可以利用这些信息,以确保你的应用程序具有它所需的各种规定版本。所产生的明显效果为,由于你的代码没有相互之间的依赖,可能很少出现中断。

    这章余下的部份分为两小节,每一小节讨论NGWS runtime的各个方面,直到你的C#应用程序能执行为止。

        ·中间语言(Intermediate Language,缩写IL)和元数据

        ·即时编译器(just-in-time compliers,简称JITers)

 

2.1.1  中间语言和元数据

    由C#编译器生成的受管代码并不是原始代码,但它是中间语言(IL)代码。这种IL代码自身变成了NGWS runtime的受管执行进程的入口。IL代码明显的优势在于它是CPU无关的,这也意味着,你要用目标机器上的一个编译器才能把IL代码转换成原始代码。

    尽管IL代码由编译器产生,但它并不是编译器提供给运行时仅有的东西。编译器同样产生代码的元数据,它告诉运行时有关代码的更多的东西,例如各种类型的定义、各种类型成员的名字以及其它数据。基本上,元数据是类型库、注册表内容和其它用于COM的信息。尽管如此,元数据还是直接和执行代码合并在一起,并没有分开。

    IL和元数据存放于扩展了PE格式的文件中(PE格式用于.exe和.dll文件)。当这样的一个PE文件被装载时,运行时从文件中定位和分离出元数据和IL。

    现在,我给出了已有的IL指令的简短目录。尽管它不是一个完整的清单,也不需要你熟记和理解,但是它为你提供了C#编程所必须具有的基础知识。

 

    ·算术和逻辑操作符

    ·控制流程

    ·直接内存访问

    ·堆栈操作

    ·参数和局部变量

    ·堆栈分配

    ·对象模式

    ·实例类型值

    ·临界区

    ·数组

    ·类型位置

    ·即时编译器(JITters)

 

2.1.2  即时编译器(JITters)

    由C#或其它能产生受管代码的编译器所生成的受管代码就是IL码。虽然IL代码被包装在一个有效的PE文件中,但是你还是不能执行它,除非它被转换成为受管原始代码。这就是NGWS runtime 即时编译器(也称作JITters)大显身手的时候。

    为什么你会对即时编译代码感到厌繁, 为什么不把整个IL PE文件编译成原始代码? 答案是时间——需要把IL代码编译成CPU规格的代码的时间。这种编译将更加有效率,因为一些程序段从来就没有被执行过。例如,在我的字处理器中,邮件合并功能从来就没有被编译。

    从技术上说,全部的处理过程如下:当一个类型被装载时,装载器创建一个存根(stub),并使它连接每一个类型的方法。当一个方法第一次被调用时,存根把控制交给JIT。JIT把IL编译为原始代码,且把存根指针指向装入缓冲区的原始代码。接着的调用将要执行的原始码。在某些位置上,所有的IL都被转换成为原始代码,这时JITter处于空闲状态。

    正如我在前面提到的,JIT编译器有很多,不止一个。在Windows平台上,NGWS runtime带有3个不同的JIT编译器。

    JIT——这是NGWS runtime默认使用的JIT编译器。它是一个后台优化的编译器 ,在前台实行数据流分析,并创建了高度优化的受管原始代码作为输出结果。JIT可以使用不严格的IL指令集编码,但是所需资源将十分可观。主要的限制在于内存足迹(footprint)、结果工作集,以及实行优化所消耗的时间。

    EconoJIT—— 和主JIT相比,EconJIT的目标是把IL高速地转换成受管原始代码。它允许把产生的原始代码装入缓冲区,但是输出码并不象主JIT生成的代码那样优化(代码小)。当内存紧张时,快速代码生成方案的优势将荡然无存。永久地丢弃无用的、已JIT过的代码,就可以把更大的IL程序装入代码缓冲区。因为JIT编译快,执行速度也仍然很快。

    PreJIT——尽管它依据主JIT,但操作起来更象是一个传统的编译器。你安装了NGWS组件,它才能运行,才可以把IL代码编译成受管原始代码。当然最终的结果为,更快的装载时间和更快的应用程序启动时间(不需要更多的JIT编译)。

在所列出的JITters中,有两个是运行时的JITters。可是你怎么决定要使用哪一个JIT,它如何使用内存? 有一个称为“JIT编译管理器”的小应用程序(jitman.exe),它存放在NGWS SDK安装目录下的bin目录中。当执行该程序时,它把一个图标加到系统任务条上,双击该图标打开程序对话框(见图2.1)。

 

        图2.1 JIT编译管理器允许你设置各种相关性能的选项

 

    尽管它是一个小小的对话框,可是你所选择的选项功能是相当强大的。每一个选项将在以下描述。

    Use EconoJIT only 选项——当该复选框没有选上时,NGWS runtime使用默认的正常的JIT编译器。前面就曾经解释过两种JITter的区别。

    Max Code Pitch Overhead(%)选项——该设置仅保留给EconoJIT。它控制了JIT编译时间和执行代码时间的百分比。如果超过了设定的值,代码缓冲区得到扩充,以缩短JIT编译所消耗的时间。

    Limit Size of Code Cache选项——该项默认为没有选中。没有选择该项意味着缓冲区将利用它所能得到的内存。如果你想限制缓冲区大小,选中该选项,这将允许你使用Max Size of Cache(bytes)选项。

    Max  Size  of  Cache(bytes)选项—控制容纳JIT代码的缓冲区的最大值。虽然你可以非常严格地限制这个值,但你还是应该小心,不能超过这个缓冲区所适合的最大值。否则该方法的JIT编译将会失败。

    Optimize For Size选项——告诉JIT 编译器,优化的目的是为了使代码更小而不是能执行得更快。这个设置默认是关掉的。

    Enable Concurrent GC[garbage collection]选项——垃圾收集(GC)默认地运行在用户代码的线程中。意味GC发生时,可能会注意到回应有轻微的延迟。为防止出现该现象,打开当前GC。注意,当前GC比标准GC更慢,它仅在windows 2000上写时(the time of writing)有效。

    当用C#创建项目时,你可能使用不同的设置试验过。当创建 UI-intensive应用程序时,你将会看到允许当前GC的最大差别。

 

2.2 虚拟对象系统(VOS)

    到目前为止,你仅看到了NGWS runtime如何工作,但是并不了解它工作的技术背景以及为什么它要这样工作。这节都是关于 NGWS 虚拟对象系统的(VOS)。

    以下为在VOS中形成声明、使用和管理类型模型时,NGWS runtime的规则。在VOS背后的思想是建立一个框架,在执行代码时不能牺牲性能,允许跨平台语言集成和类型安全。

    我提到的框架是运行时架构的基础。为了帮助你更好地了解它,我将它勾划出四个区域。当开发C#应用程序和组件时,理解它们很重要。

    VOS类型系统——提供丰富的类型系统,它打算支持全面编程语言的完全实施。

    元数据——描述和引用VOS类型系统所定义的类型。元数据的永久格式与编程语言无关,但是,元数据把自己当作一种互换机制来使用,这种互换处于工具和NGWS的虚拟执行系统之间。

    通用语言规范(CLS)——CLS定义了VOS中类型的子集,也定义了常规的用法。如果一个类库遵守CLS的规则,它确保类库可以在其它所有能实现CLS的编程语言上使用。

    虚拟执行系统(VES)——这是VOS实时的实现。VES负责装入和执行为NGWS运得时编写的程序。

    这四个部分一起组成了NGWS runtime架构。每一部分在下面小节中描述。

 

2.2.1 VOS类型系统

    VOS类型系统提供丰富的类型系统,它打算支持多种编程语言的完全实施。所以,VOS必须都支持面向对象的语言和过程编程语言。

    现在,存在着很多种近似但有点不兼容的类型。就拿整型当例子,在VB中,它是16位长,而在C++中,它是32位。还有更多的例子,特别是用在日期和时间以及数据库方面的数据类型。这种不兼容使应用程序的创建和维护不必要地复杂化,尤其当程序使用了多种编程语言时。

    另一个问题是,因为编程语言之间存在着一些差别,你不能在一种语言中重用另一种语言创建的类型。(COM用二进制标准接口部分地解决了这个问题)。 当今代码重用肯定是有限的。

    发布应用程序的最大障碍是各种编程语言的对象模型不统一。几乎每一方面都存在着差异:事件、属性、永久保存等等。

    VOS这里将改变这种现象  。VOS定义了描述值的类型,并规定了类型的所有值所必须支持的一条合约。前面提到的支持面向对象和过程编程语言,就存在着两种值和对象。

 

    对于值,类型存储于表述中,同样操作也在其中实行。对象更强大因为它显式地存于表述中。每一个对象都有一个区别于其它对象的识别号。支持不同的VOS类型在第四章 “C#类型”中提出。

 

 

2.2.2元数据

    尽管元数据用于描述和引用由VOS类型系统定义的类型,但它还不能锁定到这个单个目标。当你写一个程序时,通过利用类型声明,你所声明的类型(假定它们是数值类型或引用类型)被介绍给NGWS runtime类型系统。类型声明在存于PE可执行文件内部的元数据中得到描述。

    基本上,元数据用于各项任务:用来表示NGWS runtime用途的信息,如定位和装载类、  内存中这些类的事例、解决调用 、翻译IL为原始码、加强安全并设置运行时上下文边界。

    你不必关心元数据的生成。元数据是由C#的“代码转IL编译器”(code-to-IL compiler,不是JIT编译器)生成的。代码转IL编译器发送二进制元数据信息给PE文件,是以标准的方式发送的,不象C++编译器那样,为出口函数创建它们自己的修饰名字。

    你从元数据和可执行代码并存所获得的主要优势为,有关类型的信息同类型自身固定在一起,不会遍布很多地方。同样有助于解决存在于COM中的版本问题。进一步地,你可以在相同的上下文中使用不同的版本库,因为库不仅被注册表引用,也被包含在可执行代码中的元数据引用。

 

 

2.2.3通用语言规范

    通用语言规范(CLS)并不是虚拟对象系统(VOS)真正的一部分,它是特殊的。CLS定义了VOS中的一个类型子集,也定义了必须符合CLS的常规用法。

    那么,对此有什么迷惑呢?如果一个类库遵守CLS规则,其它编程语言同样也遵守CLS规则,那么其它编程语言的客户也可以使用类库。CLS是关于语言的交互可操作性(interoperability)。因此,常规用法必须仅遵循外部可访问项目 (externally visible  items)如方法、属性和事件等等。

    我所描述的优点是你可以做以下工作。用C#写一个组件,在VB中派生它,因加在VB中的功能是如此之强大,在C#中再次从VB类派生它。只要所有的外部可访问项遵守CLS规则,这样是可行的。

    我在这本书中出示的代码不关心CLS协定。但在构建你的类库时要注意到CLS协定。我提供了表2.1,用以给类型和外部可访问项定义协定规则。

    这个清单不完整。它仅包含一些很重要的项目。我不指出出现在本书中每一种类型的CLS协定,所以有个好主意:当你寻找CLS协定时,至少应该浏览该表,以了解哪种功能有效。不要担心你不熟悉这张表中的每一个含义,在这本书中你会学到它们。

 

                        表2.1   通能语言规范中的类型和功能

 

     ·bool

     ·char

     ·byte

     ·short

     ·int

     ·long

     ·float

     ·double

     ·string

     ·object(所有对象之母)

   

     Arrays(数组)

     数组的维数必须是已知的(>=1),而且最小下标数必须为0。

     元素类型必须是一个CLS类型。

 

     类型(Types)

     可以被抽象或隐藏。

     零或更多的接口可以被实现。不同的接口允许拥有具有相同名字和签名的方法。

     一个类型可以准确地从一个类型派生。允许成员被覆盖和被隐藏。

     可以有零或更多的成员,它们是域成员、方法、事件或者类型。

     类型可以拥有零或更多个构造函数。

     一种类型的可访问性可以是公共的或者对NGWS组件来说是局部的;但是,只有公共成员可以认为是类型接口的一部分。

     所有的值型必须从系统值型继承。异常是一个枚举——它必须从系统枚举(System Enum)继承。

                      

     类型成员

     类型成员允许隐藏或者覆盖另一种类型中的其它成员。

     参数和返回值的类型都必须是 CLS 协定类型。

     构造函数、方法和属性可以被重载。

     一个类型可以有抽象成员,但仅当类型不被封装时。

 

     方法

     一种方法可以是静态、虚拟或者实例。

     虚拟和实例方法可以是抽象的,或者是一个实现。静态方法必须总拥有一个实现。

     虚拟方法可能是最后的(或者不是)。

 

     域成员

     可以是静态或者是非静态。

     静态域成员可以被描述或只初始化。

 

     属性

     当获取和设置方法而不是使用属性语法时,属性可以公开。

     获取的返回类型和设置方法的第一个参数必须是相同的CLS类型——属性的类型。

     属性名字必须不同,不同的属性类型用于区分是不充分的。

     由于使用方法实现属性访问,如果 PropertyName 是同一个类中定义的一个属性,你不能实现命名为 get_PropertyName 和 set_PropertyName 的方法。

     属性可以被索引。

     属性访问必须遵循这种命名格式:get_ProName,set_PropName。

 

     枚举

     强调类型必须是byte、short、int 或long。

     每一个成员是一个枚举类型的静态描述域成员

     一个枚举不能实现任何接口。

     你允许给多个域成员设定相同的值。

     一个枚举必须继承系统枚举(隐含在C#中)      

 

     异常

     可以被引发和被捕获。

     自定义异常必须继承系统异常。

 

     接口

     可需要实现其它接口。

     一个接口可以定义属性、事件和虚拟方法。实现取决于派生类。

    

     事件

     要么都进行增加方法和取消方法,要么都不进行。每一种方法采用一个参数,它是从系统代表元(System Delegate)派生下来的一个类。

 

     自定义属性

     可以仅使用下列类型:Type(类型),char, char, bool, byte, short, int, long, float, double, enum (一种CLS 类型), and object.

 

     代表元(Delegates)

     可以被创建和被激活

 

     标识符(Identifiers)

     一个标识符的第一个字母必须来自一限制集。

     通过大小写在单一范围内,不可能唯一地区别两个或更多个标识符(大小写不敏感)。

 

2.2.4虚拟执行系统(VES)

     虚拟执行系统实现了虚拟对象系统。通过实现一个负责NGWS runtime的执行引擎(execution engine,缩写EE)创建VES。这个执行引擎执行由C#编写和编译的应用程序。

     下列组件为VES的一部分。

     1、中间语言(IL)——被设计为很容易被各种各样的编译器所兼容 。在该框架之外,C++、VB和C#编译器都能够生成IL。

     2、装入受管代码——包括解决内存中的名字、 表层类,并且创建JIT编译所必需的存根。通过执行经常性校验,包括加强一些访问规则,类装载器同样也增强了安全性。

     3、用JIT转换IL成原始代码——IL代码并不是设计成为一种传统的解释字节代码或树型代码,IL转换是真正的编译。

     4、装入元数据、校验类型安全和方法的完整性

     5、垃圾收集(GC)和异常处理——两者都是基于堆栈格式的服务。受管代码允许你动态地跟踪堆栈。要动态地识别各个堆栈框架,JITter或其它编译器必须提供一个代码管理器。

     6、描绘和查错服务——两者都取决于由源语言编译器所生成的信息。必须发出两个映射:一个映射从源语言结构发到指令流中的地址,一个映射从地址发到堆栈框架中的位置。当执行从IL到原始代码的转换时,这些映射被重新计算。

     7、管理线程和上下文,还有远程管理——VES为受管代码提供这些服务。

     虽然这个清单并不完整,但它足以让你理解运行时基于的由VES提供的低层架构。肯定将会有专门讨论运行时的书,而这本书只稍为深入地挖掘各种话题。

 

2.3 小结

     这一章,我带你到运行时的世界一游。描述了当创建、编译和配置C#程序时它是如何工作的。你学会了中间语言(IL),还有元数据是如何用于描述被编译为IL的类型。元数据和IL都用于JITter检测和执行代码。你甚至可以选择用哪一种JITter来执行应用程序。

     在这一章的第二部分,涉及到了运行时为何按这种方式工作的理论。你学到了虚拟对象系统(VOS)以及组成它的那部分。对于类库设计者,他们最为感兴趣的就是通用语言规范(CLS),它为基于VOS的语言协同工作设定规则。最后,你看到了虚拟执行系统(VES)如何通过NGWS runtime实现VOS。

 

NGWS 编程技术-作者 :杰弗里•里克特(Jeffrey Richter) 成为NGWS专家 NGWS是微软新的开发平台,它使创建网络应用程序、Win32 和Win64 图形用户界面和控制台应用程序、Windows服务以及用作NGWS应用程序构造块的通用组件等任务变得简单。由于NGWS是独立于语言的,所以开发人员可以使用他们所熟悉的编程语言。而且,NGWS使代码运行在并不存在指针、资源能自动清除的托管环境中,这样内存泄漏、无效内存访问以及其它常见冲突便成为了过去。它把安全性放在了最重要的位置,因此程序,甚至从互联网下载的程序,不能执行恶意的行为。 立即下载

相关推荐

组合导航、惯导、GNSS、INS、IMU的区别

‌:惯性导航系统(INS)是一种利用安装在运载体上的陀螺仪和加速度计来测定运载体位置的系统。它通过测量物体的加速度和角速度,结合算法计算出物体的位置、速度和姿态‌12。‌。

wynn1123的博客 8051

详解.NET IL代码

IL是跟我高级架构经理的分享和博客园相关的博客学习总结的,最后留2个题目,也是我的高级架构经理分享中提到的两个好玩的问题,也能看出对IL的掌握的程度。

精选资讯文章 1136

解决创建conda环境时Solving environment: failed 和 ResolvePackageNotFound 的错误

环境配置文件是在别的机器上导出的,文件里的软件包是按照导出文件的机器配置的,因此导出的时候,把这些包的详细信息也导了出来,即第二个等号后面跟着的信息,当我们按照这个文件创建环境时,conda就会根据我们机器的配置信息,按照配置文件里包的详细信息,去找这个包,那当然找不到,结果发现“查无此包”,因此也就会报上面的错误。上面找到了问题的所在之处,解决起来就很简单了,只需要在配置文件 environment.yml 中将包的详细信息删除,也就是第二个等号后面的内容。然而升级超级慢不说,也没有解决我的问题。...

番茄炒蛋三分糖 4万+

.Net IL代码研究

参考文章:http://www.cnblogs.com/zery/p/3366175.html 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉厉。 然后开始接触IL,了解了一段时后才发现原来读懂IL代码并不难。进入正题 1.1 什么是IL   IL是.NET框架中中间语言(I...

an7800666的博客 580

什么是Merkle树?用“文件柜”类比理解区块链的核心技术

Merkle树是一种用于区块链的数据结构,像一个高效的“文件柜”,用于存储和验证大量交易数据。比特币通过Merkle树将交易哈希组织成树状结构,层层汇总,最终生成一个唯一的根哈希,存储在区块头中。这种设计大幅减少数据存储和验证成本,支持快速校验交易的完整性和存在性。Merkle树通过密码学保证数据不可篡改,广泛应用于比特币、区块链及其他分布式系统。它的优势在于高效、轻量和安全,尤其适合轻节点验证和数据同步。理解Merkle树就像掌握区块链的“索引秘籍”,是Web3世界的关键技术。

在路上的专栏 1192

stm32使用TB6600驱动器控制42BYGH型步进电机

stm32使用TB6600驱动器控制42BYGH型步进电机

qq_35653974的博客 9584

runtime详细介绍

http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/ 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机。主要内容如下: 引言简介与Runtime交互Runtime术语消息动态方法解析消息转发健壮的实例变量(Non Frag

gaoyuqiang30的博客 446

YOLOv8 骨骼结构识别详细说明

YOLOv8骨骼结构识别是一种基于深度学习技术的医学影像分析方法,主要用于X光、CT等影像中的骨骼定位与识别。该系统具有多骨骼同步识别能力,可应用于手部、脊柱、骨盆等不同部位,并能精确定位骨骼关键点。技术实现包括数据预处理、模型训练、推理检测、关键点分析和批量处理五个核心模块,支持骨折检测、骨龄评估等临床应用。该系统需注意医学合规性,要求高质量标注数据,并针对骨骼影像特点进行特征工程优化,同时考虑不同设备的部署需求。

u010117029的博客 330

揭开IL代码的神秘面纱--基础篇(二)

系列文章目录 揭开IL代码的神秘面纱--基础篇(一) 揭开IL代码的神秘面纱--基础篇(二) 揭开IL代码的神秘面纱--进阶篇(一) 持续更新中...... 工具 IL指令大全 IL指令分类 IL代码编译器 ILDasm 前言 接基础篇(一),主要以案例为主,继续学习IL代码,本文主要内容是方法的返回值以及bool类型的使用。 带着问题1:方法的返回值存储在哪里?接收返回值和不接收返回值有什么区别? 带着问题2:以下两个代码有什么本质区别...

少侠Smile丶 1731

【JCR一区级】鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测【含Matlab源码 5711期】

鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测 完整代码和数据,方可运行;数据可直接替换,适合小白!可提供运行操作视频!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 3601

用R来做一个临床研究亚组分析的森林图

在编程语言里R语言最强大的功能是做图功能,我们知道在做Meta分析的时候会需要做森林图,实际上我们在很多临床研究中也经常看到森林图,主要是亚组分析的森林图,比如下面这篇文章里的一个森林图: 今天就教教大家怎么用R语言来做上面这种亚组分析的森林图 1. 在Excel里编辑好数据,按照下面的格式整理,保存为csv格式 2. 下载安装R跟Rstudio R软件的下载地址: https://mirrors.tuna.tsinghua.edu.cn/CRAN/ Rstudio下

Mrrunsen的博客 5340

OC runtime 运行时详解

一、简介 1.1 什么是Runtime Runtime是一套底层纯C语言API,我们编写的OC代码最终都会被编译器转化为运行时代码,通过消息机制决定函数调用方式,这也是OC作为动态语言使用的基础。 1.2 消息机制的基本原理 在Object-C的语言中,对象方法调用都是类似[receiver selector] 的形式,其本质:就是让对象在运行时发送消息的过程。 而方法调用[receiver selector]分为两个过程: 编译阶段 [receiver selector] 方法被编译器转化,分为.

Rey的技术博客 1446

Unity必学:Protobuf-net预编译实战

本文深入解析Unity项目使用Protobuf-net Precompile的必要性。作为高效跨平台序列化方案,Protobuf-net解决了Unity工程在网络同步、存档系统中的性能瓶颈,特别是针对iOS等AOT平台的兼容问题。通过预编译模式,将运行时反射转为静态代码生成,显著提升移动端性能表现,支持协议平滑升级,已成为大厂项目的标配方案。文章从原理、实践到多平台适配,全面展示了这一"序列化发动机"如何支撑现代Unity项目的数据传输需求。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 495

Unity C#热更新框架ILRuntime接入

Unity 纯C#热更新框架ILRuntime接入流程

shaobing32的博客 938

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mono为何能跨平台?聊聊CIL(MSIL)

前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇。到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在。所以,作为一个对Unity3D跨平台能力感兴趣的U3D程序猿,小匹夫如何能不关注CIL这个话题呢?那么下面各位看官就拾起语文老师教导我们的作文口诀(Why,What,How),和小匹夫一起走进CIL的世界吧~ Why? 回到本文的题目...

weixin_34344677的博客 613

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

揭开IL代码的神秘面纱--基础篇(一)

本文阅读时长几分钟,我相信能带你走进解读IL代码的大门。 前言 偶然一次心血来潮,想要了解更深层次的代码运行逻辑,然后就触碰到了IL代码,结果看完后一发不可收拾(想多了)。 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的。 1.1 什么是IL IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编..

少侠Smile丶 9914

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RunTime的运行机制简单使用

Runtime 自用笔记

shengyu优快云的博客 398

C#上位机之NG选点

使用方式,将NG选点窗口复制到项目中,并链接好完成NG选点按钮控件,和picbox控件。通过使用提前将NG原图保存下来,并将路径传入方法中,在从NG选点窗口中创建的CSV进行获取到数据即可。获取数据经过处理,可以直接输出图像上的坐标而不是控件坐标。在定位项目中,经常会在生产的时候出现模板匹配找不到或者匹配错误的情况,在匹配不正确的时候需要快速人工确认方向,所以就需要一个人工选点的功能——NG选点。

m0_51559565的博客 403

什么是IL

1.1 什么是IL   IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码(来源百度) 1.2 为什么要了解IL    在很多时候不明白代码是如何...

birdswillbecomdragon的博客 4975

.NET Emit 入门教程:第六部分:IL 指令:3:详解 ILGenerator 指令方法:参数加载指令

在上一篇中,我们介绍了 ILGenerator 辅助方法。本篇,将详细介绍指令方法,并详细介绍指令的相关用法。在接下来的教程,关于IL指令部分,会将指令分为以下几个分类进行讲解:1、参数加载指令:ld 开头的指令,单词为:load argument2、参数存储指令:st 开头的指令,单词为:store3、创建实例指令: new 开头的指令。4、方法调用指令:call 开头的指令。5、分支条件指令:br 开头的指令,单词为 break。

路过秋天 - 理想很美好,现实很残酷,坚持在路上,只因初心仍存 1310

.NET Emit 入门教程:第六部分:IL 指令:1:概要介绍

在.NET平台上,IL(Intermediate Language)是一种中间语言,也称为MSIL(Microsoft Intermediate Language)或CIL(Common Intermediate Language)。它是由高级语言(如C#、VB.NET等)编译而成的一种低级语言表示形式。IL 代码被保存在 .net 程序集中,并由公共语言运行时(CLR)执行。.NET平台定义了一套丰富的IL指令集,涵盖了各种常见的操作和计算需求。

路过秋天 - 理想很美好,现实很残酷,坚持在路上,只因初心仍存 1317

runtime 理解

runtime

发飙的蜗牛 412

浅谈C#中IL

一、前言 IL是什么?  Intermediate Language (IL)微软中间语言 C#代码编译过程? C#源代码通过LC转为IL代码,IL主要包含一些元数据和中间语言指令; JIT编译器把IL代码转为机器识别的机器代码。如下图 语言编译器:无论是VB code还是C# code都会被Language Compiler转换为MSIL MSI

爱做菜的炼丹师 4801

IL字节码分析

<br />-1-<br /><br />我们用C#、VB.NET语言编写的代码最终都会被编译成程序集或IL。因此用VB.NET编写的代码可以在C#中修改,随后在COBOL中使用。因此,理解IL是非常有必要的。<br /><br />一旦熟悉了IL,理解.NET技术就不会有障碍了,因为所有的.NET语言都会编译为IL。IL是一门中性语言。IL是先发明的,随后才有了C#、VB.NET等语言。<br /><br />我们将在一个短而精辟的程序中展示IL。我们还假设读者至少熟悉一门.NET语言。<br /><br

我的程序世界 1万+

NGWS runtime ------C# 开始学习 第一天 (2006.6.7)

  既然你已经具有了C#全面的印象,我也想让你了解NGWS runtime的全貌。C#依靠由NGWS提供的运行时;因此,有必要知道运行时如何工作,以及它背后所蕴含的概念。      所以,这一章分为两部分——它们是所有的概念和使用的基础。两部分的内容虽然有些重叠,但它有助于加深理解正在学习的概念。         2.1 NGWS Runtime      NGWS和NGWS Runtime为你提...

weixin_33713707的博客 136

NGWS runtime 技术基础

 既然你已经具有了C#全面的印象,我也想让你了解NGWS runtime的全貌。C#依靠由NGWS提供的运行时;因此,有必要知道运行时如何工作,以及它背后所蕴含的概念。所以,这一章分为两部分——它们是所有的概念和使用的基础。两部分的内容虽然有些重叠,但它有助于加深理解正在学习的概念。  2.1 NGWS Runtime  NGWS和NGWS Runtime为你提供了一种运行时环境。该运行时

Alibert的专栏 1015
上一篇: <展现 C#> 第一章 C#简介(修订)
下一篇: <<展现C#>> 前言(补充) 和第三章 第一个C#程序(修订)
rainbow
博客等级 码龄27年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值