В проге использую Excel для вывода отчетов — все работает на ура.
Но... почему-то после вывода отчета и команды Quit — excel остается висеть в процессах,
и "пропадает" только если я закрываю свою прогу.
Код прост (опустил обработку разных ошибок и блоки try...catch):
_Workbook wb = null;
_Worksheet ws = null;
Range r = null;
Excel.Application excel = new Excel.Application();
excel.Visible = false;
Здравствуйте, Akzhan, Вы писали:
A>excel.Quit A>if(Marshal.IsComObject(excel)) A>{ A> Marshal.ReleaseComObject(excel); A> excel = null; A>}
A>Думаю, это полностью решить твою проблему.
Спасибо — попробую.
Вот тока... Откуда "берется" этот код?
Я в том смысле, что — почему надо так делать?
"Обьект" вроде освобожден (если явно дать ему null и вызвать сборщика мусора) и должен
"умереть"...
Здравствуйте, Akzhan, Вы писали:
A>Ты всё сделал правильно, но после excel.Quit, возможно, стоит добавить
A>using System.Runtime.InteropServices;
A>... A>excel.Quit A>if(Marshal.IsComObject(excel)) A>{ A> Marshal.ReleaseComObject(excel); A> excel = null; A>}
A>Думаю, это полностью решить твою проблему.
Попробовал — результат тот же
Может так надо делать и для workbook и для worksheet?
Здравствуйте, pgerald, Вы писали:
P>Но... почему-то после вывода отчета и команды Quit — excel остается висеть в процессах,
Оговорюсь, в .NET я — полный нуль. Но в СОМах я бы сделал так:
Здравствуйте, Kell, Вы писали:
K>а попробуй создать не Excel.Application(), а Excel.ApplicationClass() K>а потом его quit
Попробовал — нифига — воз и ныне там.
дошел уже до того, что делаю Marshal.ReleaseComObject и для workbook и для worksheet обьектов.
(даже для Range делал
Есть еще какие-нить мысли как заставить работать?
Неужели у всех работает без проблем связка C#-Excel?
Здравствуйте, pgerald, Вы писали:
K>>[]
K>>excel = null
P>Пробовал — не помогает
Я в свое время, столкнувшись с этой проблемой — надо было экспорт / импорт файлов Excel в WEB приложении сделать, побороть проблему так и не смог, в результате чего сделал так:
основная софтина вывешивает семафор — в моем случае это был файл.
на сервере по шедулеру запускается другая прилада, которая при старте смотрит на наличие файла. Если файл есть, то поднимает Excel,делает свои дела и отваливается. В этом случае Excel из памяти выносится.
Я баловался с аксесом, было давно, но кажется при дебаге аксес оставался висеть в процессах.
Потом сделал обертку для аксес класса с реализацией деструктора и интерфейса IDisposable и все заработало.
Здравствуйте, pgerald, Вы писали:
P>Неужели у всех работает без проблем связка C#-Excel?
Это старая проблема. Поискав по форуму веток 6 найдется точно (длиннющих). Это не работает не только в C#, не работает это как бы ты его и откуда не вызывал.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, pukapin, Вы писали: P>>Данная проблема решается, если посылать твоему Excel процессу windows сообщение WM_CLOSE.
_FR> А можно на пример взглянуть??
Привожу далее, извини, что vb6 (проект делал на коленке...), но принцип думаю ясен.
Public Function EndTask(TargetHwnd As Long) As Integer
Dim rc As Integer
Dim ReturnVal As Integer
If IsWindow(TargetHwnd) = False Then
GoTo EndTaskFail
End If'Close the windowIf IsWindow(TargetHwnd) Then
If Not (GetWindowLong(TargetHwnd, GWL_STYLE) _
And WS_DISABLED) Then
rc = PostMessage(TargetHwnd, WS_CANCELMODE, 0, 0&)
rc = PostMessage(TargetHwnd, WM_CLOSE, 0, 0&)
DoEvents
End If
End If
GoTo EndTaskSucceed
If (GetWindowLong(TargetHwnd, GWL_STYLE) _
And WS_DISABLED) Then
GoTo EndTaskSucceed
End If
EndTaskFail:
ReturnVal = False
GoTo EndTaskEndSub
EndTaskSucceed:
ReturnVal = True
EndTaskEndSub:
EndTask = ReturnVal
End Function'here are the APL CODES:Public Function CloseExcel(ByVal hWnd As Long) As Boolean' Procedure dectects a running Excel and registers it.Const WM_USER = 1024
'Dim hwnd As LongDim rc As Integer' If Excel is running this API call returns its handle.
'hwnd = FindWindow("XLMAIN", "Microsoft Excel")If hWnd = 0 Then' 0 means Excel not running.Exit Function
Else
rc = EndTask(hWnd)
If rc <> 0 Then
CloseExcel = True
Else
CloseExcel = False
End If
End If
End Function
_FR> А если объект создан на другой машине?
С этим не сталкивался, не знаю.
Напиши пример на С#, если вздумаешь пойти этим путем, мне интересно посмотреть...
Здравствуйте, pukapin, Вы писали:
P>Данная проблема решается, если посылать твоему Excel процессу windows сообщение WM_CLOSE.
Только надо все же не забывать что будет если
а) было запущено несколько процессов Excel
б) если вы присоединяетесь к рабочему процессу Excel для генерации отчета, но прежде там были открыты другие книги.
Здравствуйте, squiz, Вы писали:
S>Здравствуйте, pukapin, Вы писали:
P>>Данная проблема решается, если посылать твоему Excel процессу windows сообщение WM_CLOSE.
S>Только надо все же не забывать что будет если
S>а) было запущено несколько процессов Excel S>б) если вы присоединяетесь к рабочему процессу Excel для генерации отчета, но прежде там были открыты другие книги.