日期:2014-05-17  浏览次数:20734 次

C#调用一个com对象,这属于"托管对象"还是"非托管对象"?
我写一个vc的com组件,用C#来调用。那么在C#的代码里面,对于这个com对象的引用,它所指向的资源到底是属于托管对象呢? 还是非托管对象呢?

我很疑惑的一点是,既然com对象可以是别的语言写的,那么该组件本身是native的,是否属于托管对象?
可是C#里面使用的时候,不用AddRef也不用显示调用Release来销毁。似乎又有点像托管对象?

到底是哪种?
谢谢。

------解决方案--------------------
它所指向的资源是非托管对象的,该非托管对象的生存周期是由CLR中的RCW来管理的,更多内容可以参考MSDN或下面的博文:
http://www.cnblogs.com/zhili/archive/2013/01/14/NetInterop.html
http://www.cnblogs.com/zhili/archive/2013/01/27/COMInterop.html
------解决方案--------------------
其实你在.Net中创建的com对象,是先通过com GUID查询到它的接口,然后“创建(复制)”原始对象(也就是LS所说的所指向的对象)的引用,将该接口的引用计数+1
看一下System.Runtime.InteropServices.Marshal.ReleaseComObject(comObj)的注释是这样说的:
Decrements the reference count of the supplied runtime callable wrapper(RCW).
引用计数-1
为什么是计数,这个就要去了解一下windows内核了