【vc++精品源码栏目提醒】:本文主要为网学会员提供“VC++的路径选择 - 讲义教程”,希望对需要VC++的路径选择 - 讲义教程网友有所帮助,学习一下!
C/CLI:建立本地世界与托 管世界互通的桥梁Agenda Visual C的路径选择 集成本地代码与托管代码 – 源代码集成 – 对象模型集成 – 函数库模块集成 – COM组件集成 – 泛型与模板集成 – 大型框架集成 Windows 平台软件开发 VC的路径选择 .NET的定位:一个高效的应用程序开发平台: – 安全健壮的运行时 – 强大统一的程序库 – 丰富的工具支持 “VC要不要支持.NET”事实上是VC要不要 继续做Windows平台应用软件开发的问题。
如果 答案为No,那么: – C 将只能用于Windows平台底层系统软件的开发 – C 程序员要想做应用软件开发,必须学习新的语言 – .NET各语言中将缺乏C这样的系统级语言 将C/CLI视作对C的良性扩展 C/CLI是各种力量妥协的产物,但是并不是一 个可恶的怪物 程序库是一门语言的生命力,强大统一的.NET类 库将为C带来福音,而不是相反 C/CLI延续了C程序员在.NET平台开发上的 “系统级”体验 C/CLI 应该是C多元文化的一部分,ECMA C/CLI 标准应被视为C的次级标准 C如何扩展支持.NET? 不用更改任何源代码,仅重新 编译 透明扩展 对程序的认知发生混乱 完整映射CLI的成功率低 将CLI组件封装在具有ISO-C 库扩展 的接口中 不能开发新的CLI组件 单向扩展策略CLI C关键字更新 C/CLI C × CLI C/CLIC 技术特点: CLI 技术特点: 静态化的对象模型 动态化的组件模型 对象空间和生成文件的高 丰富的元数据 度优化 自动内存管理 确定性内存管理 JIT编译,跨平台 特定平台目标编译 受控的运行时泛型 强大的静态模板 安全的对象句柄,数组, 灵活的指针与引用 委托(函数指针) 强大的STL MFC ATL 强大的基类库(BCL) C/CLI C/CLI的目标: 无缝集成托管代码与本地代码将CLI特性用于ISO-C类型 将ISO-C特性用于CLI类型 C/CLI的现状:C/CLI是连通C与.NET的桥梁 C/CLI集成技术图谱 技术 支持 特点 只有C/CLI支 效率高,绝大部分本地代源代码集成 C Interop 持 码被编译为IL代码 效率高,绝大部分本地代 只有C/CLI支对象模型集成 C Interop 持 码被编译为IL代码,但目 前不够完善 .NET框架支持, 非托管模块单独执行,需函数库模块集成 P/Invoke 可用于所 要类型Marshal 有.NET语言 COM互操作 .NET框架支持, COM组件单独执行,需要COM组件集成 可用于所 类型Marshal C Interop 有.NET语言 泛型只能应用于托管类型, CLR泛型, 只有C/CLI支泛型与模板集成 C模板 持 模板可应用于托管类型与 本地类型,STL.NET大型框架集成 STL.NET! MFC.NET Boost.NET 使用C Interop集成源代码 使用C Interop,可以将ISO-C代码单独编译为托管代 码,也可以将ISO-C与托管的C/CLI代码放在同一个 文件中编译,互相之间进行无缝的访问。
C Interop 技术保证了所有的ISO-C代码经过cl/clr编 译后行为保持不变。
绝大多数ISO-C代码编译后将得到托管代码,即IL代码。
部分不能编译为IL代码的采用P/Invoke调用实现,生成文 件为一个包含本地机器指令和IL指令的混合程序集。
C Interop会透明地处理其中的类型Marshal,是最为灵 活和高效的互操作方案。
混合程序集 本地空间 CLR空间代码 本地机器码 IL代码 混合程序集数据 本地数据/类型 CLR数据/类型源代码集成Code Example 集成ISO-C与CLI对象模型 ISO-C对象模型和CLI对象模型集成是C/CLI集成技术 中最为复杂,也最彰显潜力的地方。
C/CLI在对象模型集成过程中几个突出的问题 – C/CLI只支持对托管引用类型进行垃圾收集服务,不支持对 ISO-C本地类型的垃圾收集服务。
– 垃圾收集导致了托管对象地址的不稳定,与ISO-C本地对象稳 定的地址形成鲜明对比。
– C/CLI中的托管对象的内存布局也和本地对象的内存布局有明 显的不同。
– C/CLI中类型的多态机制(虚拟)也不同于本地类型的多态机 制。
对象模型结构的集成(1)在托管对象中包含本地对象的指针 在本地对象中包含托管对象的指针ref class ManagedClass class NativeClass string pText gcroot pText