回 帖 发 新 帖 刷新版面

主题:.net和com组件互操作问题,可调用包装——C#版块里最有价值的问题

每当托管客户端对某个 COM 对象调用方法时,运行库就会创建一个运行库可调用包装 (RCW)。
每次将 COM 接口指针映射到该运行库可调用包装时,此引用计数都将递增。
可以用ReleaseComObject 方法递减运行库可调用包装的引用计数。
当引用计数达到零时,运行库将释放非托管 COM 对象上的所有引用。
并且在不再需要 RCW 时释放它对该 COM 对象的引用。运行库将对 RCW 执行垃圾回收。

我把MSDN上的这几句话串一下,希望帮忙指出我的错误。并且还有些细节问题要问。

当使用托管代码的.net客户端(一个运行实列)操作COM对象时,CLR会创建一个RCW,并增加引用计数为1。当在另外一个地方使用这个COM对象时将RCW中的引用计数递增。在有些情况下,CLR不能自动完成引用计数的减少,需要调用ReleaseComObject方法来递减RCW上的引用计数。当引用计数为0时,运行库对RCW执行垃圾回收,不再有对COM的引用COM对象将释放其自身。

细节问题:

当客户端对某个COM对象调用方法,就是操作COM对象。这种操作都有哪些?
在C#中new一个COM对象就是对这个COM对象的操作,此时会创建RCW,并将COM接口指针映射到RCW;并且此时标志符其实是指向RCW的引用而不是指向COM对象的引用,对吗?
(后面会混用COM对象、COM对象的引用、RCW对象、RCW对象的引用)
所有对COM对象的操作都是通过RCW进行的,最准确的说法其实是RCW对象的引用,对吗?
声明一个COM对象(的引用),不用new初始化,会创建RCW但不将COM接口指针映射到RCW,对吗?
将一个COM对象(的引用)赋值给另一个COM对象(的引用)其实的操作是将另一个COM对象的引用(其实是RCW的引用)指向右值指向的RCW,对吗?那么这算不算操作COM对象呢?这时好像会造成左值指向的RCW失所,从而不能使其引用计数减少会造成资源泄漏。
将一个COM对象作为一函数的参数,会将COM接口指针映射到RCW,在函数退出前会自动递减RCW的引用计数,对吗。
讲一个COM对象放在{}包围的代码段里(比如循环,或者直接一个{})使用,会将COM接口指针映射到RCW,在执行过代码段会自动递减RCW的引用计数,对吗?
调用COM对象的一个成员方法算不算操作COM对象?如果算的话,是不是在方法调用前会将COM接口指针映射到RCW,调用完成自动递减RCW的引用计数?
修改COM对象的一个属性算不算操作COM对象?如果算的话,是不是在方法调用前会将COM接口指针映射到RCW,调用完成自动递减RCW的引用计数?
是否能够将一个函数的COM对象参数赋值给一个局部变量?
是否能够将一个COM对象作为一个类的构造函数的参数赋值给类的成员?
一个函数返回一个COM对象就是new一个COM对象,此时创建了一个RCW;将函数的返回赋值给另一个COM对象引用是如何实现的。
申明一个COM对象不会创建RCW,会将这个RCW引用指向null,对吗?因为只有这样才能让上边三种情况不出现问题。 
具有继承层次的COM对象进行类型转换时,是怎么个机制呢。将一个扩展COM对象转换为一个基类对象,是不是创建了一个基类对象的RCW,是否需要为这个基类对象调用releaseCOMObject?
如果将COM对象作为一个C#类的成员,应该在什么时机以何种方式掉用ReleaseComObject?
从一个COM容器类对象中取出一个对象时CLR是否为其生成RCW,这个RCW是否引用到容器对象中的对象?
从一个COM容器类对象中取出一个COM对象,此时是否需要对这个COM对象调用ReleaseComObject方法?

回复列表 (共2个回复)

沙发

发觉很少有人能像我这样思考问题。无果不能像这样思考问题,请问大家是怎么编写出无BUG的代码的。
这个贴的意义不在于这些问题的本身,可以扩展到
C#中托管代码和非托管代码之间的关系;
不同和语言互操作时的问题;
java中调用本地代码(C只能语言编写的编译为机器码的程序)中要考虑的问题;
甚至所有代码安全问题。

希望高手对帖子中问题做些回答。

板凳

进来看看顶一下!
















[url=http://www.sc115.com/vector]矢量素材[/url],[url=http://www.sc115.com/PPT]PPT模板[/url],[url=http://www.sc115.com]素材中国[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册