我已阅读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似乎会引起问题的任何想法?
答案 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;
}
}