我已经使用此代码在Excel Interop应用程序中发布了一些COM对象:
. . .
}
Marshal.ReleaseComObject(_xlSheet);
Marshal.ReleaseComObject(_xlSheets);
_xlBook.Close(false, null, null);
Marshal.ReleaseComObject(_xlBook);
_xlApp.DisplayAlerts = false;
_xlApp.Quit();
OnChanged(EventArgs.Empty);
} // foreach (DataRowView drv in selectedUnits)
Marshal.ReleaseComObject(_xlApp);
在另一个地方我也会发布那里使用的纸张:
Marshal.ReleaseComObject(_xlSheetDelPerf);
这一切都很好,但是Resharper Inspect>解决方案中的代码问题发现" 可能' null'分配给标有' NotNull'的实体属性"在两个ReleaseComObject()上调用Excel.Worksheet对象(但不调用Sheet,Workbook或Application对象)。它们的定义如下:
using Excel = Microsoft.Office.Interop.Excel;
. . .
private Excel.Application _xlApp;
private Excel.Workbook _xlBook;
private Excel.Sheets _xlSheets;
private Excel.Worksheet _xlSheet;
private Excel.Worksheet _xlSheetDelPerf;
是什么让工作表如此特殊?更重要的是,我应该删除它们的ReleaseComObject()代码吗?并使用别的东西来释放它们?
注意:问题的接受答案" 如何正确清理Excel互操作对象"通过VVS here,有474个upvotes,确实显示以这种方式发布的工作表......?!?
好的,我遵循了MethodMan的建议(谁不会,这样的绰号?)现在我有了:
// Free up resources
Marshal.ReleaseComObject(_xlSheet);
Marshal.ReleaseComObject(_xlSheets);
_xlBook.Close(false, null, null);
Marshal.ReleaseComObject(_xlBook);
_xlApp.DisplayAlerts = false;
_xlApp.Quit();
_xlSheet = null;
_xlSheets = null;
_xlBook = null;
} //if (_xlSheet != null)
OnChanged(EventArgs.Empty);
} // foreach (DataRowView drvu in selectedUnits)
Marshal.ReleaseComObject(_xlApp);
_xlApp = null;
} // try
finally
{
GC.Collect();
}