#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 файлы
Комментариев нет:
Отправить комментарий