zoukankan      html  css  js  c++  java
  • [C++/CLI编程宝典][7]基本概念

    本次讲解一些基本的概念,中英文的对照:

    1) Dynamic Link Library动态链接库/Assembly程序集 : Dynamic Link Library动态链接库,我们在ISOC++中知道,后缀为.DLL的文件为动态链接库,动态链接库实现了代码的组建级重用,但是当在CLI扩展后,与之对应的托管组建,我们称为Assembly程序集。程序集是 .NET Framework 应用程序的构造块;程序集构成了部署、版本控制、重复使用、激活范围控制和安全权限的基本单元。程序集是为协同工作而生成的类型和资源的集合,这些类型和资源构成了一个逻辑功能单元。程序集向公共语言运行库提供了解类型实现所需要的信息。对于运行库,类型不存在于程序集上下文之外。

    程序集由程序集元数据、类型元数据、中间语言代码和资源构成。如下图:

    程序集分为私有程序集和共享程序集。私有程序集是应用程序级使用,共享程序集为整个系统公用。

    2)IL中间语言 :IL = Intermediate Language中间语言,IL中间语言是CLI的基础,所有.NET源代码(不管用哪种语言编写)都被编译成IL。当软件被安装时,IL转换为机器码,或在运行时被即时(Just-In-Time,JIT)编译器所处理。当然C++/CLI是对.NET的扩展,所以理所当然C++/CLI被编译为IL代码。

    3)栈/本地堆/托管堆 :其实堆栈的概念,我们在ISOC++就有,栈也就是以前我们所说的堆栈,是由编译器自动分配释放,用来存放函数参数值,函数的返回地址,非静态局部变量的值等。其操作方式类似于数据结构中的栈(后进先出LIFO)。堆一般由程序员分配释放,若程序员不释放,程序结束可能由OS回收。当C++/CLI对CLI扩展后,由于.NET的通用语言运行时提供了垃圾回收器对堆进行自动管理,所以这个时候,以前在ISOC++的堆,这个时候就不得不被分成本地堆和托管堆,本地堆即以前的ISOC++中分配的内存,这些内存由程序员自己分配和释放,还有一种是程序员分配但是是由.NET的垃圾收集器来管理,这时的堆我们称为托管堆。

    4)本地类型/本地代码 :本地类型即以前ISOC++中的类型,此类型被分配在栈和本地堆上。使用本地类型的代码我们称为本地代码。

    5)托管类型/托管代码 :在C++/CLI中,相对于ISOC++引入了托管类型,托管类型实现的代码为托管代码。

    6)Value值类型/Ref引用类型 :托管类型又被分为value值类型和Ref引用类型。值类型被分配在栈上,引用类型被分配在托管堆上,托管堆由.NET的垃圾收集器自动管理。

    7)引用/指针/handle追踪句柄 : 在ISOC++中,我们知道引用和指针的概念,比如定义int i = 10; 引用定义int & ir = i; 和指针定义int*pI = &i; 在C++/CLI中的托管类型我们也可以自己为其分配内存,比如 system::String^ str = gcnew System::String("Hello");但是这时的内存由.NET的垃圾收集器来管理,这样的由垃圾收集器管理的由gcnew创建的对象我们称为Handle追踪句柄。

    8)property属性 :在托管类型中我们可以使用property属性,来对Field字段(成员变量)进行封装,就像是以前变量的getX()和setX()方法。

    9)delegate委托 :在托管世界中,引入了一种新的类型delegate委托,delegate其实也就是我们以前ISOC++的函数指针的定义,用来实现CALLBACK机制。

    10)events事件 : 在托管类型中可以定义event成员,event其实就是delegate的一个实例。

    11)gcnew(构造函数)/delete(~析构函数)/Finalizer(!终结函数) :程序员要想创建托管对象在托管堆上就的使用gcnew,由gcnew创建的对象我们称为handle追踪句柄,调用gcnew的过程其实包含了分配内存和构造函数的调用。当handle是有结束后,我们可以调用delete来调用析构函数同时表明该对象不再被使用以使下一轮的垃圾回收可以回收该对象,但是如果我们没有调用析构函数也没有关系,当.NET检测到该对象不再使用时就会调用终结函数同时开始着手回收该对象。

    12)attribute特性 :Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性 (Property)、返回值、结构或其他属性 (Attribute)。属性所提供的信息也称为元数据。元数据可由应用程序在运行时进行检查以控制程序处理数据的方式,也可以由外部工具在运行前检查以控制应用程序处理或维护自身的方式。例如,.NET Framework 预定义属性类型并使用属性类型控制运行时行为,某些编程语言使用属性类型表示 .NET Framework 公共类型系统不直接支持的语言功能。

    13)reflection反射 :由于C++/CLI的底层为IL,这就导致了C++/CLI编译所产生DLL和EXE具有很强自描述能力,通过放射,在没有源代码的情况任然可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成 员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

    完!


    作者:iTech
    微信公众号: cicdops
    出处:http://itech.cnblogs.com/
    github:https://github.com/cicdops/cicdops

  • 相关阅读:
    尬聊攻略丨过年回家,你最怕被亲戚问什么?
    有人被盗刷900次? 支付宝发布年终“神反转”盘点
    470余万条疑似12306用户数据遭贩卖 嫌疑人被刑拘
    利用Python实现对Web服务器的目录探测
    栈空间溢出
    KB奇遇记(6):搞笑的ERP项目团队
    探寻不同版本号的SDK对iOS程序的影响
    阅读《Android 从入门到精通》(24)——切换图片
    leetcode
    Grunt的配置及使用(压缩合并js/css)
  • 原文地址:https://www.cnblogs.com/itech/p/1375143.html
Copyright © 2011-2022 走看看