foreach中的Excel Interop CustomDocumentProperties导致挂起

时间:2014-12-04 20:04:44

标签: c# excel foreach interop

我已阅读How do I properly clean up Excel interop objects?页面,但我遇到了一个我无法弄清楚的问题。存在嵌入Excel实例并且我的插件存在导致挂起的情况。我已经发布了所有COM对象,并尝试了VSTO建议的双GC收集和GC等待行。

以下代码有效,并且不会挂起。

public static string GetCustomProperty(dynamic document, string propertyName)
{
  string returnVal = string.Empty;
  dynamic customProperties = document.CustomDocumentProperties;

  if (customProperties != null)
  {
    // Nothing
  }

  Marshall.FinalReleaseComObject(customProperties);

  return returnVal;
}

问题是,一旦代码更改为此,它就会挂起。

public static string GetCustomProperty(dynamic document, string propertyName)
{
  string returnVal = string.Empty;
  dynamic customProperties = document.CustomDocumentProperties;

  if (customProperties != null)
  {
    foreach (dynamic property in customProperties)
    {
      Marshall.FinalReleaseComObject(property);      
    }
  }

  Marshall.FinalReleaseComObject(customProperties);

  return returnVal;
}

我无法弄清楚为什么访问customProperties中的对象会导致挂起,但注释掉foreach会阻止挂起,即使内部没有任何操作或调用FinalReleaseComObject也是如此。我甚至尝试在每个对象的每个元帅之前调用双GC线,它仍然挂起。此代码是从处理释放属性来自的工作簿的事件中获得的。

关于为什么foreach似乎会引起问题的任何想法?

1 个答案:

答案 0 :(得分:1)

我不确定您的问题,可能与释放COM对象有关。我不认为CLR喜欢你发布CustomDocumentProperties,而它仍然附加到WordDocument实例。

这是我在多个生产环境中使用的代码,没有任何问题。我可以记住使用DocumentProperties时遇到的很多问题和错误,但这段代码似乎很稳定。

它得到了DocumentProperty所以你以后需要清理它们。

private object GetDocumentProperty(_Word.Document wordDocument, string name)
{
    try
    {
        return wordDocument.CustomDocumentProperties[name];
    }
    catch (ArgumentException)
    {
        //
        // Key not found.
        //
        return null;
    }
}