频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

连接 COM 与 .NET 的桥梁(1)预备知识

来源: 作者: 出处:巧巧读书 2007-10-09 进入讨论组

  本文代码使用ISO C++.net v1.1框架(VS 2003)编写,但其原理适合所有支持.net框架的语言

  一、前言

  由于传统的COM技术使用静态的非托管编程,而.net使用动态的托管编程,所以这个题目本质上讨论的是托管与非托管代码之间的互操作中的一个特例。目前的 .net v2.0 提供以下 三种互操作:

  • 模块级别的P/Invoke方法

      这种操作方法适合调用在动态链接库 (DLL)(如 Win32 API 中的 DLL)中实现的非托管函数。将在下一节讨论;

  • 组件级别的COM Interop方法

      这是本文的重头戏,它分两个部分:

      1、导出类型库的方法:本文的主角;

      2、使用封装类的方法 :该方法为CLI C++所独有,由框架自动生成包装类(在COM客户端中为非托管头文件代码),原理同第三种互操作相同;

  • 代码级别的C++ Interop方法

      这种操作方法是 CLI C++ 所独有的,即只能用在VS 2005及以上版本中。其实现非常简单,对外部 DLL 的包装全部都由向导生成,不用写一行代码,所以本文不再描述。(另一个原因是我暂时没有条件使用 VS 2005 ^_^!)

  •   二、类型转换与封送处理

      既然是两个平台、两个世界之间的互操作,它们之间的信息传递就必须转换为对方能看懂的类型,这种转换叫做“Marshal”,或者叫做“封送”。数据的封送处理是个异常复杂的过程,感兴趣的读者可以在 MSDN 中搜索描述其原理的文档“Marshaling Details”。下图是 COM Interop 的封送原理。

    连接 COM 与 .NET 的桥梁(1)预备知识(图一)
    点击查看大图

      好在 .net 平台的 Interop 程序集机制可以帮助我们进行一些简单的数据封装工作,把复杂的 Marshal 细节给隐藏了。这样使得我们在 .net 客户端中调用 COM 服务器时传递一些简单的数据会非常方便,但如果传送的数据是自定义的,则仍需手动 Marshal。该机制的原理描述在 MSDN 中的“COM 包装”。

    更多文章 更多内容请看电脑知识.NET移动与嵌入式技术.NET开发手册专题,或进入讨论组讨论。
    更多专题 【深 度 阅 读】 相 关 文 章
      收藏此文】【 】【打印】【关闭
      相关图文阅读
      频道图文推荐
      健 康 咨 询
      时 尚 咨 询
      巧巧读书宗旨
      相关专题
      讨论组问题推荐
      站内各频道最新更新文档
      站内最新制作专题
      热门关键字导读
      Photoshop教 程照片处理 照片制作 PS快捷键 抠图
      计 算 机 故 障XP系统修复
      艺 术 与 设 计设计 流媒体 设计欣赏 边框
      计 算 机 安 全ARP
      站内频道文章精选
      巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章