关于RCW的问题

mmens 2006-07-04 04:24:52
在C#中使用COM,现在有一个问题比较棘手:
我在C#中new了一个com实例的引用后,调用COM的方法进行初始化和反初始化调用,可以将COM对象释放掉。
现在我想重复使用com实例的引用,在第二次调用初始化后,开始使用,都没有问题。但是在调用反初始化的时候,不能将COM对象释放掉了。

现在可以肯定是由于使用rcw的引发的。因为我用非托管的代码多次初始化和反初始化是不会出现这个问题的。

如果使用下面的语句将COM计数清空,那么我就不能重用使用过的COM实例的引用了。
System.Runtime.InteropServices.Marshal.ReleaseComObject(object obj);

如何才能让COM对象正常的对此初始化和反初始化?请高手帮忙看看。谢谢了!

...全文
393 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmens 2006-07-05
  • 打赏
  • 举报
回复
再此谢谢shalen520(Love will keep us alive)和大家。

问题解决,不过不是我的问题,是COM的问题。

呵呵。。。转了一圈。
zlkingdom 2006-07-05
  • 打赏
  • 举报
回复
帮LZ顶了,关注一下
shalen520 2006-07-04
  • 打赏
  • 举报
回复
也是有办法的

IntPtr pUnk = Marshal.GetIUnknownForObject(myComObject);
int refCount = Marshal.Release(pUnk);
mmens 2006-07-04
  • 打赏
  • 举报
回复
谢谢shalen520(Love will keep us alive),说到点子上了,呵呵。。。就是这个问题。

现在关键就是无法通过托管代码将COM的引用计数-1.只能通过System.Runtime.InteropServices.Marshal.ReleaseComObject(object obj);来减1了。可是这样一来,我在托管代码中的引用也会被释放掉了,因为RCW不管你引用了n个,它只保留1。所以很无奈啊!

也就是寻找一种在托管代码中将COM引用减1的方法。
shalen520 2006-07-04
  • 打赏
  • 举报
回复
现在我想重复使用com实例的引用,在第二次调用初始化后,开始使用,都没有问题,但是在调用反初始化的时候,不能将COM对象释放掉了。

=============================================
初始化会增加组件对象的引用计数,两次初始化引用计数就是2,每一次反初始化[你的叫法]只会将引用计数减1;调用一次反初始化之后组件的引用计数由2变为1,大于0,而只有当引用计数小于等于0的时候才会真正释放
liuwenbin19 2006-07-04
  • 打赏
  • 举报
回复
UP

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧