tag:blogger.com,1999:blog-458002489272917533.post8594772082558581495..comments2024-02-14T14:07:38.890+05:00Comments on Блог Александра Бындю: Не закрывается процесс Excel.exe, созданный через Interop.Excel?Alexander Byndyuhttp://www.blogger.com/profile/14185486842573956085noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-458002489272917533.post-73178994855315304562009-06-14T22:08:03.252+06:002009-06-14T22:08:03.252+06:00Эта строка абсолютно бесполезна
application = null...Эта строка абсолютно бесполезна<br />application = null; <br />Потому что все .NET объекты умирают, когда выходят из зоны видимости. В памяти остается именно COM объект, т.к. не все ссылки на него уничтожены.<br />Если ты будешь использовать сложные конструкции типа <br />sheet.Cells[1, 1].EntireColumn.AutoFit();<br />то excel.exe скорее всего останется висеть в памяти.Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-84532290712742626792009-06-12T13:41:54.549+06:002009-06-12T13:41:54.549+06:00после строки 10 у меня только 1 строка:
applicatio...после строки 10 у меня только 1 строка:<br />application = null; <br /> для того, чтобы отвязать указатель =)<br /> после закрытия программы и эксэля процесс умираетAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-3745067234882346192009-05-25T10:24:01.531+06:002009-05-25T10:24:01.531+06:00Нет предела совершенству :) Новый вариант БЕЗ испо...Нет предела совершенству :) Новый вариант БЕЗ использования не фэн-шуйного DllImport'а - прибиваем процесс по его HWND:<br /><br />Process.GetProcesses().Where(p => p.MainWindowHandle.ToInt32() == applicationHwnd).ToList().ForEach(process => process.Kill());exception.cpphttps://www.blogger.com/profile/00113195693971046972noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-59098383796362163962009-05-25T10:13:23.739+06:002009-05-25T10:13:23.739+06:00Да, Денис, ты прокачался круче всех =)Да, Денис, ты прокачался круче всех =)Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-3860438418786535942009-05-25T10:12:32.841+06:002009-05-25T10:12:32.841+06:00Для истинных ценителей всей убогости Excel.Interop...Для истинных ценителей всей убогости Excel.Interop предлагаю 100% гарантированный и безопасный способ борьбы с висящими зомби-процессами:<br /><br />[DllImport("user32.dll", SetLastError = true)]<br />static extern uint GetWindowThreadProcessId(int hWnd, ref int lpdwProcessId);<br />.......<br />application = new Application {Visible = false, DisplayAlerts = false};<br />int excelProcessId = -1;<exception.cpphttps://www.blogger.com/profile/00113195693971046972noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-86248543870022717122009-05-24T01:10:54.407+06:002009-05-24T01:10:54.407+06:00Да. Забавный этот Excel. После исправлений одной п...Да. Забавный этот Excel. После исправлений одной программы чистил все через ReleaseComObject, приравнивал линки к null + сразу делал GC.Collect. Excel выгружается, но на всякий пожарный всетаки оставил код с убийством процесса :))Alexey Lyubkohttp://it-arts.comnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-31364464102504399222009-05-23T09:02:48.016+06:002009-05-23T09:02:48.016+06:00@Ivan
Да, как вариант.
Уже получается:
1. Следить...@Ivan<br />Да, как вариант.<br /><br />Уже получается:<br />1. Следить за удалением COM объектов из памяти<br />2. Использовать позднее связывание<br />3. Создать COM объекты в отдельном доменеAlexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-3556042669115298482009-05-23T06:34:19.727+06:002009-05-23T06:34:19.727+06:00По идее все должно решаться без изращений (без Rel...По идее все должно решаться без изращений (без ReleaseComObject) если запускать процедуру работы с Excel в отдельном Application Domain<br /><br />См. AppDomain.CreateDomain... <br /><br />Признаюсь, что с Excel не пробовал, но с другими COM компонентами помогало.Unknownhttps://www.blogger.com/profile/00454444059653162856noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-36517474471500535902009-05-22T19:33:06.888+06:002009-05-22T19:33:06.888+06:00@nikdmt
Да, можно и так. Такой вариант я даже нахо...@nikdmt<br />Да, можно и так. Такой вариант я даже находил где-то на MSDN. На самом деле по синтаксису он не на много проще стандартного варианта (который привел я).<br /><br />Спасибо за дополнение!Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-43351215518100638602009-05-22T19:20:45.051+06:002009-05-22T19:20:45.051+06:00А если использовать динамическую привязку к Excel?...А если использовать динамическую привязку к Excel?<br />Через:<br />obj.GetType().InvokeMember(name, BindingFlags.GetProperty, null, obj, null);nikdmthttps://www.blogger.com/profile/00124845558759361966noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-63923238666005688632009-05-22T19:19:23.770+06:002009-05-22T19:19:23.770+06:00Этот комментарий был удален администратором блога.nikdmthttps://www.blogger.com/profile/00124845558759361966noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-79846348210348589232009-05-22T18:42:02.201+06:002009-05-22T18:42:02.201+06:00@Shum
Да, другая крайность запоминать все процессы...@Shum<br />Да, другая крайность запоминать все процессы до начала работы с Excel и убивать созданный процесс командой Kill =)Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-26702136205243027292009-05-22T16:00:31.850+06:002009-05-22T16:00:31.850+06:00Значит нормально работать с Excel.Interop и избежа...Значит нормально работать с Excel.Interop и избежать утечек памяти могут только законченные маньяки-параноики :)exception.cpphttps://www.blogger.com/profile/00113195693971046972noreply@blogger.com