Excel中的Interop CustomDocumentProperties导致挂起

我已阅读该页面如何正确清理Excel互操作对象? 但我遇到了一个我无法弄清楚的问题。 有一种情况是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?


我不确定你的问题,可能与释放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;
    }
}
链接地址: http://www.djcxy.com/p/35715.html

上一篇: Excel Interop CustomDocumentProperties in foreach Causes Hang

下一篇: Why is killing the Excel process a bad thing?