操作完成后释放Excel * 32进程

时间:2013-09-05 17:30:18

标签: c# excel marshalling comobject

试图找出为什么我的EXCEL * 32进程在我的应用程序和excel文件都关闭之前一直处于使用状态。我必须在创建之后遗漏一些东西,就像应用程序在此代码之后保留在EXCEL * 32资源上一样。有任何建议让它在导出操作完成后“放手”吗?

另外,我不想关闭新创建的Excel工作表,我只想释放与我的实际.net应用程序相关的资源。

Application xls = new Application();
xls.SheetsInNewWorkbook = 1;

// Create our new excel application and add our workbooks/worksheets
Workbook Workbook = xls.Workbooks.Add();
Worksheet CrossoverPartsWorksheet = xls.Worksheets[1];

// Create our new excel application and add our workbooks/worksheets
Workbook Workbook = xls.Workbooks.Add();
Worksheet CrossoverPartsWorksheet = xls.Worksheets[1];

/////////////////////////////////////////
// < DO EXCEL EXPORT OPERATIONS HERE > //
/////////////////////////////////////////

// Release our resources.
Marshal.ReleaseComObject(Workbook);
Marshal.ReleaseComObject(CrossoverPartsWorksheet);
Marshal.ReleaseComObject(xls);

2 个答案:

答案 0 :(得分:2)

写作时

Workbook Workbook = xls.Workbooks.Add();

CLR不仅为Workbook创建RCW(运行时可调用包装器)对象,而且对于Workbooks集合也是如此(因为您需要将对象用于Add()方法)。如果CLR创建RCW对象并且您没有保留引用 - 您无法最终确定它。

所以,主要规则是: 您应避免使用双点调用表达式

var workbooks = xls.Workbooks;
var workbook = workbooks.Add();

Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);

答案 1 :(得分:0)

Marshal.FinalReleaseComObject(xls)就是你要找的。