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

per*_*ain 9 c# com vsto

除了这些之外,在C#中销毁Excel COM Interop对象的方法有哪些:

object_instance = null;
System.GC.collect();
&
System.Runtime.InteropServices.Marshal.ReleaseComObject(object);
Run Code Online (Sandbox Code Playgroud)

请建议只使用内置技术,而不是像bigcannon等其他工具.

Cyl*_*Cat 16

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

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

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

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


Joh*_*n K 15

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

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

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

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

  • @peril你在谈论托管或非托管对象?正如jdk所说,将IDisposable用于非托管对象.根据我的知识,明确地销毁托管对象是不可能的,但可能会有更多关于*你想破坏的内容的细节会有所帮助.就像一个猜测,如果它是一个安全相关的字符串,只需要很快保留在内存中,请查看SecureString.此外,Streams(即MemoryStream)可以根据我的知识明确提供. (2认同)