清理.net应用程序中COM对象的最佳方法

清理.net应用程序中COM对象的最佳方法,com,interop,Com,Interop,我正在处理一个.Net windows应用程序,它在内部使用COM dll。 在以下4种释放COM对象的方法中,哪一种是最好的 1. if (obj != null) { Marshal.ReleaseComObject(obj); } 2. if (obj != null) { Marshal.ReleaseCom

我正在处理一个.Net windows应用程序,它在内部使用COM dll。 在以下4种释放COM对象的方法中,哪一种是最好的

1.
 if (obj != null)
                {
                    Marshal.ReleaseComObject(obj);
                }

2.
 if (obj != null)
                {
                    Marshal.ReleaseComObject(obj);
                    obj=null;
                }


3.if (obj != null)
                {
                    Marshal.FinalReleaseComObject(obj);
                }


4.if (obj != null)
                {
                    Marshal.FinalReleaseComObject(obj);
                    obj=null;
                }
谢谢你的阅读。

5。让GC来做吧

这很好,除非COM组件保留了您需要的重要资源


如果您是基于检查
obj!=null
然后将
obj
设置为
null
是一个好主意,除非您确定不会多次调用此代码

最好的方法是:需要有关应用程序实现的更多详细信息,以便在使用
ReleaseComObject
FinalReleaseComObject
之间提供具体建议,但理想情况下,两者都不是。

<5。让GC来做吧

这很好,除非COM组件保留了您需要的重要资源


如果您是基于检查
obj!=null
然后将
obj
设置为
null
是一个好主意,除非您确定不会多次调用此代码


最好的方法是:需要更多关于应用程序实现的详细信息,以便在使用
ReleaseComObject
FinalReleaseComObject
之间提供具体建议,但理想情况下,答案是两者都不是。

要么让GC按照Richard的建议处理,要么让你的第二个。如果您调用
FinalReleaseComObject
,您将销毁运行时可调用包装器,无论它是否也被用于代码的其他部分。这可能会严重混淆代码的其他部分。因此,每次从COM transition进入.NET land时,您应该只调用
ReleaseComObject
一次。

或者按照Richard的建议让GC处理,或者您的号码2。如果您调用
FinalReleaseComObject
,您将销毁运行时可调用包装器,无论它是否也被用于代码的其他部分。这可能会严重混淆代码的其他部分。因此,每次从COM transition进入.NET land时,您应该只调用
ReleaseComObject
一次。

感谢Richard和bdonlan的反馈。是的,此代码不会被多次调用,因此我可以将其设置为null。我将释放ComObject[#2选项]感谢Richard和bdonlan的反馈。是的,此代码不会被多次调用,因此我可以将其设置为null。我将释放ComObject[#2选项]