在C#中使用COM,现在有一个问题比较棘手:
我在C#中new了一个com实例的引用后,调用COM的方法进行初始化和反初始化调用,可以将COM对象释放掉。
现在我想重复使用com实例的引用,在第二次调用初始化后,开始使用,都没有问题。但是在调用反初始化的时候,不能将COM对象释放掉了。现在可以肯定是由于使用rcw的引发的。因为我用非托管的代码多次初始化和反初始化是不会出现这个问题的。如果使用下面的语句将COM计数清空,那么我就不能重用使用过的COM实例的引用了。
System.Runtime.InteropServices.Marshal.ReleaseComObject(object obj);如何才能让COM对象正常的对此初始化和反初始化?请高手帮忙看看。谢谢了!

解决方案 »

  1.   

    现在我想重复使用com实例的引用,在第二次调用初始化后,开始使用,都没有问题,但是在调用反初始化的时候,不能将COM对象释放掉了。=============================================
    初始化会增加组件对象的引用计数,两次初始化引用计数就是2,每一次反初始化[你的叫法]只会将引用计数减1;调用一次反初始化之后组件的引用计数由2变为1,大于0,而只有当引用计数小于等于0的时候才会真正释放
      

  2.   

    谢谢shalen520(Love will keep us alive),说到点子上了,呵呵就是这个问题。现在关键就是无法通过托管代码将COM的引用计数-1.只能通过System.Runtime.InteropServices.Marshal.ReleaseComObject(object obj);来减1了。可是这样一来,我在托管代码中的引用也会被释放掉了,因为RCW不管你引用了n个,它只保留1。所以很无奈啊!也就是寻找一种在托管代码中将COM引用减1的方法。
      

  3.   

    也是有办法的IntPtr pUnk = Marshal.GetIUnknownForObject(myComObject);
    int refCount = Marshal.Release(pUnk);
      

  4.   

    再此谢谢shalen520(Love will keep us alive)和大家。问题解决,不过不是我的问题,是COM的问题。呵呵转了一圈。