是否清除包含 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 影响!
我有一个包含不同 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 影响!