Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Как программно закрыть Excel при возникновении исключительной ситуации?

#c_sharp #excel #com


try
{
    excelApp.Workbooks.Open(fileName);
    //Делаем что-то, что вызывает исключение
    //System.Runtime.InteropServices.COMException
}
catch (Exception ex)
{

}
finally
{
    //При дебаге в этот блок кода заходит, но в процессах 
    //остается висеть EXCEL.EXE
    excelApp.Quit();
}

    


Ответы

Ответ 1



Народ с английского SO (см.) Рекомендует добавить: excelApp.Application.Quit(); excelApp.Quit();

Ответ 2



Попробуйте еще вызвать дополнительно (после Quit): Marshal.FinalReleaseComObject(excelApp); Надо также запоминать ссылку на открытую workbook, и аналогичным образом освобождать.

Ответ 3



В данном коде создается две временных переменных, которые никто не освобождает: excelApp.Workbooks.Open(fileName); Нужно освобождать каждый объект: var workbooks = excelApp.Workbooks; var sheet = workbooks.Open(fileName); ... Marshal.ReleaseComObject(workbooks); Marshal.ReleaseComObject(sheet); и т.д.

Ответ 4



Простой в использовании костыль для убивания екселя в любом случае независимо от того освобождал ты обьекты или нет. 100%ное срабатывание. Но костыль. [DllImport("user32.dll")] private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); private Application _excelApp; private void CloseExcelApp() { int hWnd = _excelApp.Application.Hwnd; uint processID; GetWindowThreadProcessId((IntPtr)hWnd, out processID); Process.GetProcessById((int)processID).Kill(); } В целом же я советую не работать с ексель файлами через Интерпоп. Детали почему так найдешь сдесь: Как просто работать с / открыть / изменить / сохранить Excel / CSV файлы

Комментариев нет:

Отправить комментарий