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

本文代码使用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 的封送原理。


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

下图摘自 MSDN 2003 版,描述了.net v1.1 将把我们的数据从一个平台的类型转换为另一个平台的何种类型,表中没有没有显式标识的任何类型都将被转换为 Int32 系统类型。


嗯...看上去还真不少,不过别高兴的太早了,在实际的使用中只有如int等较为简单的类型才能保证各种灵活的传递方式而不出问题...@_*。需要注意的是,COM一方的VARIANT类型(这也是编写COM时的推荐类型)将按照其vt的值来转换为具体的类型并封装,所以COM一方设置vt时一定要设对了,别乱设!另外对于表中没有给出的具体类型,最好不要使用或作为自定义类型进行封装。

有关数据类型转换的详细介绍,请参见MSDN中的"COM 数据类型",自定义类型的描述文档是"自定义标准包装"。如果想让.net组件也像COM组件那样实现回调接口或者连接点,则需要托管接口与该接口的非托管实现之间的通信,这时需要自定义Marshal封送处理,实现这个功能的文档是"自定义封送处理"。

时间: 2024-10-31 15:17:36

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

《51单片机应用开发从入门到精通》——第 1 章 单片机开发预备知识 1.1 单片机开发流程

第 1 章 单片机开发预备知识 单片机的应用十分广泛,从工业控制到家用电器,许多地方都有单片机的身影.掌握了单片机开发技术,不仅能够根据自己的需要进行电子设计,实现自己的一些想法,而且也为进一步学习嵌入式技术打下一定的基础. 本章将对单片机应用系统的软.硬件设计以及开发和调试等各个方面加以介绍,以便读者能通过对本章的学习较快地完成单片机应用系统的研制工作. 1.1 单片机开发流程 单片机的开发主要分为硬件开发和软件开发,在系统设计上又有最小系统和扩展系统两种.下面将通过系统硬件设计.软件设计进行

《C语言编程魔法书:基于C11标准》——第2章 学习C语言的预备知识 2.1 计算机体系结构简介

第2章 学习C语言的预备知识 我们在第1章已经大致介绍了C语言的概念以及编译.连接流程.我们知道C语言是高级语言中比较偏硬件底层的编程语言,因此对于用C语言的编程人员而言,了解一些关于处理器架构方面的知识是很有必要的,对于嵌入式系统开发的程序员而言更是如此了. 另外,C语言中有很多按位计算以及逻辑计算,所以对于初学者来说,如果对整数编码方式等计算机基础知识不熟悉,那么对这些操作的理解也会变得十分困难.因此,本章将主要给C语言初学者.同时也是计算机编程初学者,提供计算机编程中会涉及的基本知识,这样

《Linux防火墙(第4版)》——第1章 数据包过滤防火墙的预备知识 1.1OSI网络模型

第1部分 数据包过滤以及基本安全措施 第1章 数据包过滤防火墙的预备知识 一个小型站点可能会通过多种方式连接到互联网,如T1专线.电缆调制解调器.DSL.无线.PPP.综合业务数字网(ISDN)或者其他的方式.直接连接到互联网的计算机通常是安全问题的焦点.无论是一台计算机还是由连接起来的多台计算机所组成的局域网(LAN),对于小型站点来说,最初的焦点将是直接连接到互联网的那台计算机.这台计算机将被用来搭建防火墙. 防火墙(firewall)这个术语根据其实现方式和使用目的不同而有多种不同的含义.

《C++ Primer Plus(第6版)中文版》——第1章 预备知识

第1章 预备知识 C++ Primer Plus(第6版)中文版 本章内容包括: C语言和C++的发展历史和基本原理. 过程性编程和面向对象编程. C++是如何在C语言的基础上添加面向对象概念的. C++是如何在C语言的基础上添加泛型编程概念的. 编程语言标准. 创建程序的技巧. 欢迎进入C++世界!这是一种令人兴奋的语言,它在C语言的基础上添加了对面向对象编程和泛型编程的支持,在20世纪90年代便是最重要的编程语言之一,并在21世纪仍保持强劲势头.C++继承了C语言高效.简洁.快速和可移植性的

《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览1.1 例说编程语言

第一篇 预备知识篇 第1章 C魔法概览 本章内容主要对C编程语言(以下简称C语言)进行大体介绍,包括它的历史以及C语言标准的演化进程.然后介绍一下C语言编程思想,当前主流C语言编译器以及GNU语法扩展.最后简单介绍一下从用C语言编写程序到编译.构建一个可执行程序的大致过程. 计算机编程语言从对计算机硬件底层的抽象程度进行分类,可分为:机器语言.汇编语言以及高级语言.下面由底层到高层分别介绍这几种类别的编程语言. 1.1 例说编程语言 1)机器语言是直接通过十六进制数表示当前处理器架构的机器指令码

《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览 1.1 例说编程语言

第一篇 预备知识篇 第1章 C魔法概览 本章内容主要对C编程语言(以下简称C语言)进行大体介绍,包括它的历史以及C语言标准的演化进程.然后介绍一下C语言编程思想,当前主流C语言编译器以及GNU语法扩展.最后简单介绍一下从用C语言编写程序到编译.构建一个可执行程序的大致过程. 计算机编程语言从对计算机硬件底层的抽象程度进行分类,可分为:机器语言.汇编语言以及高级语言.下面由底层到高层分别介绍这几种类别的编程语言. 1.1 例说编程语言 1)机器语言是直接通过十六进制数表示当前处理器架构的机器指令码

《精通 ASP.NET MVC 5》----1.4 本书的预备知识

1.4 本书的预备知识 为了通过本书获得最大收益,你应该熟悉Web开发基础,了解HTML和CSS的工作机制,以及C#的工作知识.如果对客户端细节有点模糊,没有关系.本书的重点是服务器端开发,而且可以通过示例获取所需要的知识.第4章提供了MVC开发最有用的C#语言特性概要,如果你正从低版本向最新版的.NET过渡,便会意识到这些信息是有用的.

《R语言数据挖掘》----第1章 预备知识 1.1大数据

本节书摘来自华章出版社<R语言数据挖掘>一书中的第1章,第1.1节,作者[哈萨克斯坦]贝特·麦克哈贝尔(Bater Makhabel),李洪成 许金炜 段力辉 译,更多章节内容可以访问"华章计算机"公众号查看. 第1章 预备知识 本章中,你将学习基本的数据挖掘术语,比如数据定义.预处理等.最重要的数据挖掘算法将通过R语言进行说明,以便帮助你快速掌握原理,包括但不局限于分类.聚类和异常值检测.在深入研究数据挖掘之前,我们来看一看将要介绍的主题:数据挖掘社交网络挖掘文本挖掘网络

《51单片机应用开发从入门到精通》——第 1 章 单片机开发预备知识

第 1 章 单片机开发预备知识 51单片机应用开发从入门到精通单片机的应用十分广泛,从工业控制到家用电器,许多地方都有单片机的身影.掌握了单片机开发技术,不仅能够根据自己的需要进行电子设计,实现自己的一些想法,而且也为进一步学习嵌入式技术打下一定的基础. 本章将对单片机应用系统的软.硬件设计以及开发和调试等各个方面加以介绍,以便读者能通过对本章的学习较快地完成单片机应用系统的研制工作.