Я использую сообщество Visual Studio 2015 в C# и Office 2013 автономно.Не удается закрыть Excel.exe после его уничтожения из диспетчера задач
Приведенный ниже код работал, чтобы открыть и закрыть Excel. Затем я добавил код, чтобы открыть конкретный рабочий лист, как в примере 2 ниже. И это сработало, Excel закрыт правильно.
Затем я переехал, но забыл использовать ReleaseComObject
для рабочего листа, и Excel остался открытым, поэтому я вручную закрыл его в диспетчере задач.
Теперь НИКАКИЕ из приведенных ниже примеров не работают. После того, как я случайно забыл выпустить COM-объект, Excel никогда не закрывается, если я не перезагружу свою машину.
Пример 1
private bool loadExcel()
{
// Open Excel
Excel.Application myApp = new Excel.Application();
// Hide Excel
myApp.Visible = false;
GSIWorkbook = myApp.Workbooks.Open("D:\\Test.xlsx");
// Cleanup
GSIWorkbook.Close(false);
// Manual disposal because of COM
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(GSIWorkbook) != 0)
{ }
myApp.Application.Quit();
myApp.Quit();
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp) != 0)
{ }
myApp = null;
GSIWorkbook = null;
GC.Collect();
GC.WaitForPendingFinalizers();
return true;
} // End loadExcel
Пример 2
private bool loadExcel()
{
// Open Excel
Excel.Application myApp = new Excel.Application();
// Hide Excel
myApp.Visible = false;
GSIWorkbook = myApp.Workbooks.Open("D:\\Test.xlsx");
for (int counter = 1; counter < 100; counter++)
{
try
{
GSIWorksheet = GSIWorkbook.Sheets[counter];
if (GSIWorksheet.Name == _gsi2Sheet)
break;
}
catch
{
continue;
}
}
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(GSIWorksheet) != 0)
{ }
// Cleanup
GSIWorkbook.Close(false);
// Manual disposal because of COM
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(GSIWorkbook) != 0)
{ }
myApp.Application.Quit();
myApp.Quit();
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp) != 0)
{ }
myApp = null;
GSIWorkbook = null;
GC.Collect();
GC.WaitForPendingFinalizers();
return true;
} // End loadExcel
ли вы имеете в виду VS сообщества? Visual Studio? – Grantly
«Excel никогда не закрывается, если я не перезагружу свою машину». ... Кроме того, просто откройте диспетчер задач и убейте все оставшиеся процессы «excel.exe». –
Как я уже говорил выше, я использую C#, а не VB, и я не использую «.Add» в любом месте. Убийство в диспетчере задач не является чистым решением, и использование proc.Kill() приведет к уничтожению всех экземпляров Excel. Я понимаю, что я мог обнаружить идентификатор процесса (PID), а затем убить только этот процесс. Но это тоже похоже на kluge. Должен быть чистый способ закрыть Excel после того, как я пройду через него. – OneWileyDog