COM包装(COM Wrappers)
为了实现传统的COM程序与.NET程序之间的相互调用,.NET提供了两个包装类:运行时可调用包装(runtime callable wrapper,RCW)和COM可调用包装(COM callable wrapper,CCW)。每当一个.NET客户程序调用一个COM对象的方法时就会创建一个RCW对象;相反,每当一个COM客户程序调用一个.net对象的方法时就会创建一个CCW对象.
1.运行时可调用包装(RCW)
公共语言运行时通过名为运行时可调用包装(RCW)的代理来公开COM对象。虽然RCW在.net客户端看起来是普通的对象,但他的主要功能是封装在.Net客户端和COM对象之间传递的调用。
RCW的主要功能:
(1)RCW实际上是runtime生成的一个.Net类,它包装了COM组件的方法,并内部实现对COM组件的调用。
(2)列集(marshal).Net客户与COM对象之间的调用,列集的对象包括方法的参数,返回值等,比如c#中的string与COM中的BSTR之间的转换。
(3)CLR为每个COM对象创建一个RCW,与对象上的引用数无关,就是说每个COM对象有且只会有一个RCW对象。
(4)RCW中包含了COM对象的接口指针,并管理COM对象的引用计数。RCW自身的释放通过Garbage Collection机制管理。
无论一个COM对象存在多少个引用,运行时只为每个COM对象创建一个RCW。运行时只为每个对象维护一个每进程的RCW。如果在一个应用程序域或单元中创建RCW,然后将引用传递至另外一个应用程序域或单元,则会使用第一个对象的代理。如图对于公开INew和INewer接口的COM对象,任意数目的托管客户端都可以持有引用。

利用从类型库中导出的元数据,运行时将创建所调用的COM对象和该对象的包装。每个RCW都会在它所包装的COM对象上维护一个接口指针缓存,并且在不再需要RCW时释放它对该COM对象的引用。运行时对RCW执行垃圾回收。
2.COM可调用包装
当COM客户端调用一个.net对象时,公共语言运行时将创建托管对象以及该对象的COM可调用包装(CCW).由于无法直接引用.net对象,COM客户端会将CCW用作托管对象的代理。

COM包装(COM Wrappers)的更多相关文章
- 「 JavaScript 篇 」
一.JavaScript 里有哪些数据类型,解释清楚 null 和 undefined,解释清楚原始数据类型和引用数据类型.比如讲一下 1 和 Number(1)的区别js中有5种数据类型:Undef ...
- Orchard是如何呈现内容的
首先Orchard是一个建立在ASP.NET MVC框架上的CMS应用框架.Orchard在呈现内容的时候也遵循MVC的规律,也是通过Controller来处理Url请求并决定用那个View来呈现那种 ...
- [Hive]HiveServer2配置
HiveServer2(HS2)是一个服务器接口,能使远程客户端执行Hive查询,并且可以检索结果.HiveServer2是HiveServer1的改进版,HiveServer1已经被废弃.HiveS ...
- django 之(二) --- 源码分析
CBV类视图继承 CBV:继承自View:注册的时候使用的as_view() 入口 不能使用请求方法的名字作为参数的名字 只能接受已经存在的属性对应的参数 定义了一个view 创建了一个类视图对象 保 ...
- Decorators and Wrappers in Python
python代码一贯以优雅,简洁著称,而有时侯反而会让人难以理解,比如说wrapper(或者说decorator),这种方式提高了代码的可重用性,使用起来更简洁方便. 举个例子,比如WebApp常用的 ...
- Linux网络IO函数以及TCP连接函数包装
标准I/O VS 网络IO 标准I/O又称为标准I/O流,从某种意义上讲是全双工的,因为程序能够在同一个流上执行输入和输出. Unix/Linux对网络的抽象是一种称为套接字的文件类型.和任何Unix ...
- 【Keras案例学习】 sklearn包装器使用示范(mnist_sklearn_wrapper)
import numpy as np from keras.datasets import mnist from keras.models import Sequential from keras.l ...
- 流包装器实现WebShell免杀
说明: 本文首发自 https://www.secpulse.com/archives/73391.html ,转载请注明出处. 前言 本文是看PHP使用流包装器实现WebShell有感,权当做个笔记 ...
- 【突然想多了解一点】可以用 Task.Run() 将同步方法包装为异步方法吗?
[突然想多了解一点]可以用 Task.Run() 将同步方法包装为异步方法吗? 本文翻译自<Should I expose asynchronous wrappers for synchrono ...
随机推荐
- 【译文】漫谈ASP.NET中的Session
最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错,顺手查了一下,貌似没有现成的译文,于是一咬牙一跺脚把这篇文章翻译出来了 ...
- 云服务器 ECS Linux 系统添加“回收站”
删除是危险系数很高的操作,一旦误删可能会造成难以估计的损失.在云服务器 ECS Linux 系统中这种危险尤为明显.比如,一条简单的语句:rm –rf /* 就会把整个系统全部删除,而 Linux 并 ...
- 《转》Java中HashMap详解
HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实 ...
- 如何为Linux安装Go语言
导读 Go 语言又称为 golang, 是由 Google 最初开发的一种开源编程语言,其在设计时就遵循了简单.安全和速度的 3 大原则.Go 语言具有多种调试.测试.分析和代码审查工具,如今 Go ...
- LeetCode14 Longest Common Prefix
题意: Write a function to find the longest common prefix string amongst an array of strings. (Easy) 这两 ...
- 测试你是否和LTC水平一样高
Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上!你的任务是:计算方程x^2+y^2+z^2= num的一个正整数解. ...
- 【HTML5 2】《html5 开发精要与实例讲解》 step1 -- 导读
一.教程重点:以 综合性案例 为导向,辅之以 精要知识点 二.内容概况: 第1部分:通过 大小型案例 对 各重要知识点 进行详细讲解 第2部分:jWebSocket.RGraph.WebGL 三个重要 ...
- 从源码的角度解析View的事件分发
有好多朋友问过我各种问题,比如:onTouch和onTouchEvent有什么区别,又该如何使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图 ...
- 补充:tableView优化总结
tableView优化方式总结 (说明:一下只是我自己的小总结,会有不足,望大神指正,多谢大家了) 1 缓存 cell 的行高.目的方便第二遍访问 cell. 2 减少图片的blend 操作.包括:设 ...
- jquery 的 ajax 在 非阻塞 时返回 XMLHttpRequest
jquery 的 ajax 在 非阻塞 时返回 是 [object XMLHttpRequest] 对象(firefox 下 alert(对象名) 也可以直接看到对象类型) 返回的内容用 reques ...