RCW是.net 对com的包装,比如office就是通过RCW来被.net调用的。可以百度:office pia 了解更多信息。

RCW 是一个.net类。

1.关闭线程对rcw的自动清理

System.Threading.Thread.CurrentThread.DisableComObjectEagerCleanup();

2.立即清理rcw

System.Runtime.InteropServices.Marshal.CleanupUnusedObjectsInCurrentContext();

不过经过实际测试,没发现有什么作用,还没有摸索出应用场合。但是可以肯定的是,立即清理rcw并不会清理rcw,至少还活着(被引用)的rcw不会被清理。

在析构函数执行阶段:

如果你代码中用了析构函数,试图清理rcw对象,这个做法可能不如你想象中达成。

rcw是一个.net 对象,所有.net 对象的析构函数的执行顺序是不确定的,也就是你想用析构函数去操控rcw,而rcw可能自身已经释放了。这里面的释放并不是说rcw已经死亡,而是说rcw对com的引用关系已经释放,你再调用它包装的com对象的任意成员,都会引发:System.Runtime.InteropServices.InvalidComObjectException,提示:COM 对象与其基础 RCW 分开后就不能再使用。

究竟rcw是选择怎样的时机释放com的,我不得而知,估计也是类似使用虚构函数或者被GC直接回收(但因为我的析构函数有它的引用应该不会)。有虚构函数的对象会比没有的回收速度要慢一级。

另外,rcw并不是真的正确释放了com,com对象还是存在的,只是rcw不能控制。

如何让rcw正确清理,这个rcw是否提供什么机制,这点没搞清楚。但是客户类只能通过显式的dispose接口来写清理代码,并正确调用。

虽然很有很多迷雾,为了帮助后人探索,记录至此。

RCW 生存期控制的更多相关文章

  1. 对.net技术组件的分析和选择

    .net很庞杂,学习最忌讳什么?为了学而学,而不是为了用而学.我们不是为了成为教师,所以不要成为书呆子,不要成为"博士",要从庞杂的技术群中选择自己需要的内容进行学习. 如果不加选 ...

  2. c++智能指针实现方式1

    #include<iostream> using namespace std; // 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针 // 这个类的所有成员都是pri ...

  3. .NET知识结构

    .NET知识结构 .NET介绍 微软.NET战略及技术体系,.NET Framework框架类库(FCL),公共语言运行时(CLR),通用类型系统(CTS),公共语言规范(CLS),程序集(Assem ...

  4. com组件接口

    int main( int argc, char *argv[] ) {    cout << "Initializing COM" << endl;   ...

  5. C++中智能指针的设计和使用

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235 智能指针(smart pointer)是存储指向动态分配(堆 ...

  6. c++ smart pointer

    智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是使用引用计数(reference ...

  7. Com原理及應用——Com對象和接口

    1.COM对象的理解 COM对象类似于C++语言中类的概念,类的每个实例代表一个COM对象,它也包括属性(即状态)和方法(即操作),状态反映对象的存在,方法就是接口. 2.COM对象的标识-CLSID ...

  8. c++(smart pointer)

    (一)首先对智能指针有一些概念性的了解 **********本部分内容摘自开源中国社区http://my.oschina.net/u/158589/blog/28994******** 1.什么是智能 ...

  9. C++11智能指针 share_ptr,unique_ptr,weak_ptr用法

    0x01  智能指针简介  所谓智能指针(smart pointer)就是智能/自动化的管理指针所指向的动态资源的释放.它是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动 ...

随机推荐

  1. CSS3——3D旋转图(跑马灯效果图)

    CSS3新增了很多新的属性,可以用很少的代码实现炫酷的动画效果,但由于兼容性各浏览器的能力存在不足,有特别需求的网站就呵呵啦.H5C3已是大势所趋了,之前看过一个新闻,Chrome将在年底全面转向H5 ...

  2. 基本排序算法——基数排序java实现

    基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...

  3. Centos6_64 rpm打包实践

    安装rpmbuild sudo yum install rpm-build 普通用户的配置 /home/you/rpmbuild/ 假设是要构建rpm的目录 先说说rpmbuild有什么用,给一个例子 ...

  4. 实用控件分享:自定义逼真相机光圈View

    最近手机界开始流行双摄像头,大光圈功能也应用而生.所谓大光圈功能就是能够对照片进行后期重新对焦,其实现的原理主要是对拍照期间获取的深度图片与对焦无穷远的图像通过算法来实现重新对焦的效果. 在某双摄手机 ...

  5. Lucene搜索方式大合集

    package junit; import java.io.File; import java.io.IOException; import java.text.ParseException; imp ...

  6. DP优化与换零钱问题

    1 当贪心不再起效的时候 对于换零钱问题,最简单也是性能最好的方法就是贪心算法.可是贪心算法一定要满足面值相邻两个零钱至少为二倍关系的前提条件.例如1,2,5,10,20……这样的零钱组应用贪心最简单 ...

  7. SE_homework1(第一部分)

        题目:写一个能自动生成小学四则运算题目的命令行"软件",分别满足下列各种需求.下面这些需求都可以用命令行参数的形式来指定: a.)除了整数以外,还支持真分数的运算.(例如1 ...

  8. 如何自动化一键部署PHP项目

    1.技能需求 完成自动化一键部署PHP需要:PHP(略懂),Shell(略懂),git(略懂) 2.最终效果 输入密码,回车,5~20秒后(一般一天一次持续交付,部署的代码量和sql脚本都不会很大) ...

  9. python time和datetime的常用转换处理

    一.time 1.获取当前时间和时区 >>> now = time.time() # 当前时间 float类型 >>> time.strftime("%Y ...

  10. 理解 Keystone 核心概念 - 每天5分钟玩转 OpenStack(18)

    作为 OpenStack 的基础支持服务,Keystone 做下面这几件事情: 管理用户及其权限 维护 OpenStack Services 的 Endpoint Authentication(认证) ...