C# GC.Collect与Marshal.ReleaseComObject和RCW

C# GC.Collect与Marshal.ReleaseComObject和RCW,c#,garbage-collection,interop,C#,Garbage Collection,Interop,我的C中有一个COM对象引用,有时我需要被丢弃,设置为Null然后重新创建。似乎有一些缓存正在进行或可能导致“COM对象已与其基础RCW分离”类型的错误。我在将对象设置为Null后立即强制执行GC.Collect以丢弃RCW,从而解决了这个问题,但这种笨手笨脚且效率低下的方法是不好的 我想使用Marshal.ReleaseComObject,但这只会减少引用计数,问题会一直持续到GC实际运行为止。(更不用说打电话了,这通常也是个坏主意) 我如何确保在重新创建COM引用时,我得到了一个新的RCW,

我的C中有一个COM对象引用,有时我需要被丢弃,设置为Null然后重新创建。似乎有一些缓存正在进行或可能导致“COM对象已与其基础RCW分离”类型的错误。我在将对象设置为Null后立即强制执行GC.Collect以丢弃RCW,从而解决了这个问题,但这种笨手笨脚且效率低下的方法是不好的

我想使用Marshal.ReleaseComObject,但这只会减少引用计数,问题会一直持续到GC实际运行为止。(更不用说打电话了,这通常也是个坏主意)


我如何确保在重新创建COM引用时,我得到了一个新的RCW,并且一切正常?

ew。您正在将COM非托管资源与.NET GC混合并匹配。坏主意。RC包装器不是实现IDisposable吗?RCW是“在后台”我只是在创建一个VB库中定义的对象,像往常一样连接事件和调用方法。当我用新定义的对象(它们是网格底层数据源的一部分)快速替换对象时,我可以通过强制GC.Collect来解决这种情况。在释放COM对象以及如何使用它们时,您需要非常小心。你说你正在连接事件和其他东西,你是在处理对象之前取消订阅吗?如果您在其他地方使用对象的任何属性,您是否正在处理它们?当引用属性或获取子对象时,是否将它们分配给临时变量并处理它们?如果仍然存在真正的引用,GC.Collect是否会收集该对象失败?