是否清除包含 ComObject 的列表,在 C# 中释放所有这些对象?

Does clearing a List containing ComObject, release all of them in c#?

我有一个包含不同 ComObject 的列表。如果我这样做 myList.Clear() 就足够了还是我应该遍历它并执行此操作。

for (int i = 0; i < myList.Count; ++i)
     if (System.Runtime.InteropServices.Marshal.IsComObject(myList[i]))
         System.Runtime.InteropServices.Marshal.ReleaseComObject(myList[i]);

     myList.Clear();

它没有坏,所以不要修复它。如果您对 COM 对象的收集语义没有问题,请让垃圾收集器完成它的工作。如果您遇到问题,请 仔细描述问题以及您对 C# 中的 COM 互操作的理解

特别是,调用 ReleaseComObject 来管理 RCW 或更糟,实际 pUnknown 上的 Release 仅供互操作专家使用的 利器。不正确地使用这些工具会使您陷入各种可怕的情况,充满崩溃和内存损坏。 (如果您曾经看到 "COM object is detached from its RCW" 异常,您就知道有人认为他们知道自己在做什么,但他们认为 ReleaseComObject 错了。)

如果您不了解 RCW 是什么或它的用途或它与底层 COM 对象有何不同,在您理解它之前请停止编写互操作代码。内存安全系统专为您的安全和便利而设计;除非你能描述所有这样做的后果,否则不要乱搞。

我注意到您的实际问题从未得到回答:

Does clearing a List containing ComObject, release all of them in c#?

当然不是。为什么要这样?它 清除列表 。当您的程序逻辑需要清除列表时清除列表。不要清除列表,因为您认为这样做会对其他代码产生一些 knock-on 影响!