清理.net应用程序中COM对象的最佳方法
我正在处理一个.Net windows应用程序,它在内部使用COM dll。 在以下4种释放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
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选项]