24.03.2017, 16:36 | #1 |
Участник
|
Завершить процесс Excel 2013
Товарищи, после некоторых действий с Excel 2013 - не могу избавиться от висящего процесса.
Например, вот такой код (чуть модифицированный ComExcelDocument_RU::excelVersion() ) оставляет после себя висеть процесс. X++: static void Job25(Args _args) { ComExcelDocument_RU excelDocument; COM comDocument; COM comApplication; real excelVersion; try { excelDocument = ComExcelDocument_RU::construct(); excelDocument.newFile('', false); comDocument = excelDocument.getComDocument(); if (comDocument) { comApplication = comDocument.application(); if (comApplication) { excelVersion = str2num(comApplication.version()); } } //excelDocument.closeDocument(); excelDocument.quitApplication(true); } catch (Exception::Internal) { excelDocument.closeDocument(); if (comDocument == null || comApplication == null) { throw error("@SYS98748"); } } info(strFmt("%1", excelVersion)); } На Ax2009, Ax2012, Ax2012R3 + Офис 2013 - процесс после выполнения кода остается. Может быть кто-то сталкивался и знает как лечить? |
|
26.03.2017, 09:13 | #2 |
Участник
|
|
|
26.03.2017, 09:20 | #3 |
Участник
|
Как про общие методы я про это слышал и пытался их использовать, но в данном примере - неудачно (возможно, что-то делал криво).
Если у вас в аналогичной ситуации это помогло - не могли бы вы привести рабочий кусок кода? Если делать процесс экселя видимым, то никаких запросов сохранять/не сохранять - я не получаю, окно экселя закрывается молча (но процесс остается) |
|
26.03.2017, 12:40 | #4 |
Участник
|
В случае работы через .Net еще помогал вызов сборки мусора.
Взаимодействие с Excel через .NET (семейство классов SysExcel) Может в вашем случае тоже поможет ? |
|
26.03.2017, 16:33 | #5 |
Участник
|
Еще можно попробовать явно освободить переменные
COM comDocument; COM comApplication; вызовом comDocument.finalize(); comApplication.finalize(); |
|
27.03.2017, 08:57 | #6 |
Участник
|
Также пробовал через .NET вызывать
X++: Microsoft.Office.Interop.Excel.Application tExcel = new Microsoft.Office.Interop.Excel.ApplicationClass(); real version; str strVersion; ; strVersion = tExcel.get_Version(); info(strVersion); tExcel.Quit(); tExcel = null; System.GC::Collect(); System.GC::WaitForPendingFinalizers(); Ну или такой вариант - аналогично X++: static void Job25(Args _args) { ComExcelDocument_RU excelDocument; COM comDocument; COM comApplication; real excelVersion; try { excelDocument = ComExcelDocument_RU::construct(); excelDocument.newFile('', false); comDocument = excelDocument.getComDocument(); if (comDocument) { comApplication = comDocument.application(); if (comApplication) { excelVersion = str2num(comApplication.version()); } } excelDocument.quitApplication(true); if (comDocument) { comDocument.finalize(); comDocument = null; } if (comApplication) { comApplication.finalize(); comApplication = null; } System.GC::Collect(); System.GC::WaitForPendingFinalizers(); } catch (Exception::Internal) { excelDocument.closeDocument(); if (comDocument == null || comApplication == null) { throw error("@SYS98748"); } } info(strFmt("%1", excelVersion)); } Последний раз редактировалось Pandasama; 27.03.2017 в 09:00. |
|
27.03.2017, 11:29 | #7 |
Участник
|
Заметил что в течение 5-15 минут зависшие процессы, если их не прибить руками, исчезают сами. То есть какая-то сборка мусора (может быть что-то внутривиндовое) их все-таки подчищает.
Хотелось бы, конечно, форсировать как-то, с учетом того что это не помогло: X++: System.GC::Collect(); System.GC::WaitForPendingFinalizers(); |
|
27.03.2017, 11:40 | #8 |
Участник
|
А это пробовали?
X++: comDocument.finalize(); comApplication.finalize(); |
|
27.03.2017, 11:55 | #9 |
Участник
|
Да, я выше привел пример с использованием всех методов:
X++: excelDocument.quitApplication(true); if (comDocument) { comDocument.finalize(); comDocument = null; } if (comApplication) { comApplication.finalize(); comApplication = null; } System.GC::Collect(); System.GC::WaitForPendingFinalizers(); |
|
28.03.2017, 08:42 | #10 |
Участник
|
На просторах интернета примеров по теме много, т.е. у многих такая проблема, в целом условно все сводится к тому, что самый действенный способ это просто завершение процесса Excel по его идентификатору(если нужно форсировать закрытие приложения), примеры можно посмотреть вот тут :
Close Excel Process with Interop Как закрыть процесс Excel? - C# У меня самого именно таких примеров не было, чтобы оставался висеть процесс Excel после вызовов сборщика, finalize, и обнуления переменной приложения, в исключительных случаях присваивал null всем объектам экселя типа workbooks, workbook и т.д.
__________________
Sergey Nefedov Последний раз редактировалось SRF; 28.03.2017 в 08:45. |
|
|
За это сообщение автора поблагодарили: Pandasama (1). |
28.03.2017, 10:19 | #11 |
Участник
|
При использовании DotNet-сборки Excel закрываю следующим образом -
X++: excelDocument.closeDocument(false, fullFileNamePath); excelDocument = null; CodeAccessPermission::revertAssert(); new InteropPermission(InteropKind::ClrInterop).assert(); System.GC::Collect(); System.GC::WaitForPendingFinalizers(); CodeAccessPermission::revertAssert();
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
29.03.2017, 10:25 | #12 |
Участник
|
А может причина в том, что в ветке
X++: catch (Exception::Internal) X++: excelDocument.quitApplication(true); И может быть в основной ветке после вызова excelDocument.quitApplication(true); надо убрать все пляски с comDocument.finalize(); и с comApplication.finalize(); Может быть, само упоминание comDocument и comApplication воскрешают Эксель. Я сейчас интенсивно работаю в AX2012 с Экселем, и таких проблем нет. Все решает excelDocument.quitApplication(true); Последний раз редактировалось Ace of Database; 29.03.2017 в 10:29. |
|
29.03.2017, 10:35 | #13 |
Участник
|
Нет, в эту ветку код не попадает.
Проблема не в Ax2012, а в конкретной версии Офиса (возможно, даже не просто 2013м офисе - а каком-то билде/патче). В Ax 2009, как я писал выше, это тоже проявляется |
|
29.03.2017, 13:19 | #14 |
Участник
|
Не совсем по теме, но у Вас антивирус установлен? Не пробовали для тестирования его отключить? Может, это антивирус не дает немедленно закрыть Excel, а потом просто переходит в режим ожидания и далее закрытие по таймауту происходит
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
29.03.2017, 13:26 | #15 |
Участник
|
|
|
Теги |
excel, excel 2013 |
|
|