如何清理Excel.AppEvents AdviseSinks?

时间:2016-07-28 18:04:34

标签: c# .net excel com vsto

因此,当我在一个嵌入式场景中使用WorkbookOpen事件时遇到了一个问题:它是一个记录良好的问题:

阅读此博客文章 https://blogs.msdn.microsoft.com/vsofficedeveloper/2008/04/11/excel-ole-embedding-errors-if-you-have-managed-add-in-sinking-application-events-in-excel-2/

我不仅需要IConnectionSink,还要在作为参数传递的每个工作簿对象上调用Marshal.ReleaseComObject。

public class ExcelAppEventSink : Excel.AppEvents
{
... other functions ...

public void WorkbookOpen(Excel.Workbook Wb)
{
  <-- operate on workbook -->
  Marshal.ReleaseComObject(Wb);
}

... other functions ...
}

但微软公司发布的另一篇博文在2年后发布声称Marshal.ReleaseComObject很危险。 https://blogs.msdn.microsoft.com/visualstudio/2010/03/01/marshal-releasecomobject-considered-dangerous/

因为我只需要发布RCWs 2016年就更安全了 而是在函数调用结束时CleanupUnusedObjectsInCurrentContext

额外的阅读材料:

1 个答案:

答案 0 :(得分:0)

所以这个答案非常好:https://stackoverflow.com/a/349202/不想为每个COM对象指定使用,但除此之外代码非常干净。