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