这是(潜在的)问题:
我创建了一个 COM 对象,然后使用“foreach”循环访问它返回的集合中的每个元素。我是否需要释放我在集合中迭代的每个单独元素? (请参阅下面的代码。)如果是这样,我想不出一种方法来有效地从“finally”语句中释放它,以防万一在操作该项目时出现错误。
有什么建议吗?
private static void doStuff()
{
ComObjectClass manager = null;
try
{
manager = new ComObjectClass();
foreach (ComObject item in manager.GetCollectionOfItems())
{
Log.Debug(item.Name);
releaseComObject(item); // <-- Do I need this line?
// It isn't in a 'finally' block...
// ...Possible memory leak?
}
}
catch (Exception) { }
finally
{
releaseComObject(manager);
}
}
private static void releaseComObject(object instance)
{
if (instance != null)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(instance);
}
catch
{
/* log potential memory leak */
Log.Debug("Potential memory leak: Unable to release COM object.");
}
finally
{
instance = null;
}
}
}
最佳答案
您不应该对 COM 对象使用 foreach
语句,因为引用是在幕后进行的,您无法控制释放。我会切换到 for
循环并确保你 never use two dots with COM objects.
这看起来会是这样的:
try
{
manager = new ComObjectClass();
ComObject comObject = null;
ComObject[] collectionOfComItems = manager.GetCollectionOfItems();
try
{
for(int i = 0; i < collectionOfComItems.Count; i++)
{
comObject = collectionOfComItems[i];
ReleaseComObject(comObject);
}
}
finally
{
ReleaseComObject(comObject);
}
}
finally
{
ReleaseComObject(manager);
}
关于c# - 我是否需要在每次 'foreach' 迭代时释放 COM 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317850/