如何在C#中销毁COM对象?

时间:2010-03-15 16:34:38

标签: c# com vsto

在C#中销毁Excel COM Interop对象的方法有哪些:

object_instance = null;
System.GC.collect();
&
System.Runtime.InteropServices.Marshal.ReleaseComObject(object);

请仅建议使用内置技术,而不是其他工具,如bigcannon等。

6 个答案:

答案 0 :(得分:16)

踢球者是如果你没有删除对象的所有引用,即使GC.Collect也不会销毁它。

C#(或.NET一般)中的规则是你不能破坏对象。 Dispose()不会这样做。终结者不会这样做(规则2,除非你知道为什么需要它,否则不要使用终结器,也不要直接调用它。)

对于.NET,这些是您需要做的事情:

  1. 如果对象包含对非托管对象的引用,请实现IDispose模式。并充分实施;它不仅仅是提供Dispose()方法。
  2. 拥有终结器的唯一原因是释放非托管对象,并且仅在您的对象未正确处理的情况下。一旦调用了dispose方法,它就应该进行清理,然后通过调用GC.SuppressFinalize来“终止”终结器。
  3. 如果您正在使用实现Dispose()方法的对象,请在完成该对象后调用Dispose()。最佳实践是使用using块分配该对象。从using块退出将自动调用Dispose()。
  4. 完成对象后,删除对象的所有引用,包括事件处理程序,委托等。
  5. 除此之外,相信垃圾收集器可以完成它的工作。不要乱搞垃圾收集器;你只会把事情变得更糟,除非你真的,真的,真的知道你在做什么以及为什么。

答案 1 :(得分:15)

垃圾收集器是唯一可以销毁托管对象的机制,但通常不会显式调用它。你只是让它做它的事。

就像你从不把自己的垃圾带到车厂一样,你只要把它放在拐角处。这总是垃圾人的责任。

您可以释放对事物的引用并使用IDisposable,终结器和析构函数进行清理,但不能销毁它们。

通过使用System.GC,您可以要求垃圾人尽早做事 - 只为自己请求自定义运行 - 但这通常搞砸了他的日程安排,他有更多的垃圾要处理,而不仅仅是你的,所以它不是推荐的。

答案 2 :(得分:2)

在大多数情况下,您必须删除对对象的所有引用。只有这样,垃圾收集者才会看到并销毁它。

请注意这一点:

object_instance = null;

所有这一切都是杀死object_instance引用。如果它是唯一的参考,这是有效的。如果有其他参考,则不会收集。

var skywalker = new Person();
var object_instance = skywalker;

...

object_instance = null;
//It's still alive and won't be collected because skywalker lives...

答案 3 :(得分:0)

如果您的对象分配了大量资源,最好实现IDisposable并显式调用Dispose。如果由于某种原因无法调用Dispose,并且您的类保留了非托管内存,则可以使用GC.AddMemoryPressure(在终结器中使用匹配的GC.RemoveMemoryPressure)告诉GC您的类比它看起来更重,优先级更早清理。

答案 4 :(得分:0)

如果你真的需要明确释放一个对象所占用的内存,并且你确定你会选择比GC更好地消除它的那一刻,那么唯一合理的选择是在堆栈上分配它并让它在死时丢失你从分配它的方法返回。

答案 5 :(得分:0)

如果您想要控制以便管理对象的资源,那么实现IDisposable接口。

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

如果资源不是您想要显式控制对象销毁的原因,我无法理解为什么您需要这种控制级别......您是否使用对象池?