Excel中的Interop CustomDocumentProperties导致挂起

我已阅读该页面如何正确清理Excel互操作对象? 但我遇到了一个我无法弄清楚的问题。 有一种情况是Excel实例被embedded,我的插件存在导致挂起。 我已经发布了所有的COM对象,并尝试使用VSTO中build议的双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; } }