Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 操作完成后释放Excel*32进程_C#_Excel_Marshalling_Comobject - Fatal编程技术网

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

C# 操作完成后释放Excel*32进程,c#,excel,marshalling,comobject,C#,Excel,Marshalling,Comobject,试图找出为什么在我的应用程序和EXCEL文件关闭之前,我的EXCEL*32进程仍在使用。在创建之后,我肯定遗漏了一些东西,就像应用程序在这段代码之后抓住了EXCEL*32资源一样。有什么建议可以让它在完成导出操作后“放手”吗 另外,我不想关闭新创建的Excel工作表,我只想释放与实际.net应用程序相关的资源 Application xls = new Application(); xls.SheetsInNewWorkbook = 1; // Create our new excel app

试图找出为什么在我的应用程序和EXCEL文件关闭之前,我的EXCEL*32进程仍在使用。在创建之后,我肯定遗漏了一些东西,就像应用程序在这段代码之后抓住了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);
Application xls=新应用程序();
xls.wWorkbook=1;
//创建新的excel应用程序并添加工作簿/工作表
工作簿=xls.Workbooks.Add();
工作表CrossoverPartsWorksheet=xls.工作表[1];
//创建新的excel应用程序并添加工作簿/工作表
工作簿=xls.Workbooks.Add();
工作表CrossoverPartsWorksheet=xls.工作表[1];
/////////////////////////////////////////
//<在此执行EXCEL导出操作>//
/////////////////////////////////////////
//释放我们的资源。
Marshal.ReleaseComObject(工作簿);
Marshal.ReleaseComObject(跨部件工作表);
元帅发布对象(xls);

封送。FinalReleaseComObject(xls)
是您要查找的对象。

当您编写

Workbook Workbook = xls.Workbooks.Add();
CLR不仅为
工作簿
创建(运行时可调用包装器)对象,还为工作簿集合创建(因为您需要用于
添加()
方法的对象)。若CLR创建了RCW对象,而您并没有保留引用,那个么您就无法完成它

因此,主要规则是: 应避免使用双点调用表达式

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

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

重复的?已经看过这一部分,这是我从中获得Marshal.ReleaseComObject部分的地方。这不是正确的方法。改为调用GC.Collect()。当你把它放在方法的末尾时,阅读理解为什么它不起作用。将其放在调用方方法中。我可以一起避免GC,根据@Dmitry Martovoi提供的公认答案,这在实际不需要GC的情况下是理想的。在关闭.net应用程序之前,仍然不会在任务管理器中发布。因此,我创建了3个不同的Excel导出并关闭了所有3个导出,在我退出应用程序之前,所有导出都显示为正在运行的进程。我不确定你做错了什么,我已经测试过很多次了。请确保退出应用程序并使用此方法处理所有excel对象。我认为这就是问题所在,正如您刚才所说的。我不想放弃任何东西。我想让excel应用程序和excel导出应用程序保持打开状态,只是不希望应用程序保留资源。我说得通吗?轰!这是可行的,但没有意识到有一个RCW(说实话,我甚至不知道那是什么)。