1

试图弄清楚为什么我的 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);
4

2 回答 2

2

当你写

Workbook Workbook = xls.Workbooks.Add();

CLR 创建RCW(运行时可调用包装器)对象不仅用于Workbook,而且还用于 Workbooks 集合(因为您需要将用于Add()方法的对象)。如果 CLR 创建 RCW 对象并且您不保留引用 - 您无法完成它。

所以,主要规则: 你应该避免双点调用表达式

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

Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
于 2013-09-05T17:36:16.863 回答
0

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

于 2013-09-05T17:32:42.520 回答