c# - 如何销毁 C# 中的 COM 对象?

标签 c# com vsto

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

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

请仅建议内置技术,不要建议其他工具,如 bigcannon 等。

最佳答案

关键在于,如果您没有删除对该对象的所有引用,即使 GC.Collect 也不会销毁它。

C#(或一般的 .NET)中的规则是您不能销毁对象。 Dispose() 不会这样做。终结器不会这样做(规则 2,除非您知道为什么需要它,否则不要使用终结器,并且永远不要直接调用它)。

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

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

关于c# - 如何销毁 C# 中的 COM 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448763/

相关文章:

c# - Nunit 测试命名约定示例

c# - 无需管理员权限即可创建 outlook 插件

c# - 如何制作多种语言的 Web/API 帮助?

c# - 如何对两个字节值使用 C# 的三元运算符?

c# - 仅显示任何日期尚未预订的空闲时段

excel - 尝试通过 TCL (tcom) 编辑 xsl 文件时出现未知错误 0x800A01A8

c++ - VSS 硬件供应商

C# COM-Interop dll for C++ COM dll 在 2 个解决方案之间不起作用

c# - 如何从单独的 C# 项目调用 VSTO AddIn 方法?

c# - ftp上传太大