Excel进程不关闭
这个问题在这里已经有了答案:
这是一个关于办公应用程序在.NET应用程序断开连接后保持打开状态的有趣知识库。
从Visual Studio .NET客户端自动化后Office应用程序不会退出
代码示例都在链接中(vb.net抱歉)。 基本上它会告诉你如何正确设置和拆卸办公室应用程序,以便在完成后关闭它。
System.Runtime.InteropServices.Marshal.FinalReleaseComObject
是魔术发生的地方。
编辑:您需要为您创建的每个Excel对象调用FinalReleaseComObject。
if (excelWorkSheet1 != null)
{
Marshal.FinalReleaseComObject(excelWorkSheet1);
excelWorkSheet1 = null;
}
if (excelWorkbook != null)
{
Marshal.FinalReleaseComObject(excelWorkbook);
excelWorkbook = null;
}
if (excelApp != null)
{
Marshal.FinalReleaseComObject(excelApp);
excelApp = null;
}
DotNet只在所有手柄释放后才释放COM对象。 我所做的是评论一切,然后加回一部分。 看看它是否发布Excel。 如果它不遵循以下规则。 当它释放时,添加更多的代码,直到它不再次释放。
1)创建Excel变量时,将所有值设置为空(这样可以避免未启动的错误)
2)不要重复使用变量而不先释放它Marshal.FinalReleaseComObject
3)不要双点(ab = z)
。 dotNet创建一个临时变量,它不会被释放。
c = a.b;
c = z;
Marshal.FinalReleaseComObject(c);
4)发布所有的Excel变量。 越快越好。
5)将其设置回NULL。
将文化设置为“en-US”。 有一个错误会使Excel与某些文化碰撞。 这确保它不会。
以下是关于如何构建代码的一个想法:
thisThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
InteropExcel.Application excelApp = null;
InteropExcel.Workbooks wkbks = null;
InteropExcel.Workbook wkbk = null;
try
{
excelApp = new InteropExcel.Application();
wkbks = excelApp.Workbooks;
wkbk = wkbks.Open(fileName);
...
}
catch (Exception ex)
{
}
if (wkbk != null)
{
excelApp.DisplayAlerts = false;
wkbk.Close(false);
Marshal.FinalReleaseComObject(wkbk);
wkbk = null;
}
if (wkbks != null)
{
wkbks.Close();
Marshal.FinalReleaseComObject(wkbks);
wkbks = null;
}
if (excelApp != null)
{
// Close Excel.
excelApp.Quit();
Marshal.FinalReleaseComObject(excelApp);
excelApp = null;
}
// Change culture back from en-us to the original culture.
thisThread.CurrentCulture = originalCulture;
}
我终于完成了。 您需要为Workbooks集合添加一个变量,然后按照其他答案中所述使用FinalReleaseComObject。 我想你使用的每个可能的Excel COM对象必须以这种方式处理。
try
{
// Create an instance of Microsoft Excel and make it invisible
excelApp = new Excel.Application();
excelApp.DisplayAlerts = false;
excelApp.Visible = false;
// open a Workbook and get the active Worksheet
excelWorkbooks = excelApp.Workbooks;
excelWorkbook = excelWorkbooks.Open(excelFile, Type.Missing, true);
excelWorkSheet1 = excelWorkbook.ActiveSheet;
}
catch
{
throw;
}
finally
{
NAR( excelWorkSheet1 );
excelWorkbook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
NAR(excelWorkbook);
NAR(excelWorkbooks);
excelApp.Quit();
NAR(excelApp);
}
}
private void NAR(object o)
{
try
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject( o );
}
catch { }
finally
{
o = null;
}
}
链接地址: http://www.djcxy.com/p/73529.html
上一篇: Excel process not closing
下一篇: How to calculate the angle of the sun above the horizon using pyEphem