Помогите: Excel не выгружается из памяти
От: pgerald  
Дата: 14.01.03 06:15
Оценка:
Привет All!

В проге использую Excel для вывода отчетов — все работает на ура.
Но... почему-то после вывода отчета и команды Quit — excel остается висеть в процессах,
и "пропадает" только если я закрываю свою прогу.
Код прост (опустил обработку разных ошибок и блоки try...catch):
_Workbook wb = null;
_Worksheet ws = null;
Range r = null;

Excel.Application excel = new Excel.Application();
excel.Visible = false;

wb = excel.Workbooks.Open(nameXlsFile, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value);

ws = (_Worksheet) wb.Sheets.get_Item(1);
...
// Дальше код вывода отчета
...

excel.UserControl = false;
wb.Save();
excel.Quit();

Пробовал даже GC.Collect() делать — все равно безрезультатно...
Есть какие-нить идеи, мысли как это побороть?

С уважением
Павел
Re: Помогите: Excel не выгружается из памяти
От: kreek  
Дата: 14.01.03 06:22
Оценка:
Здравствуйте, pgerald, Вы писали:

[]

excel = null
... << RSDN@Home 1.0 beta 3 >>
Re: Помогите: Excel не выгружается из памяти
От: Akzhan Россия http://www.akzhan.midi.ru/devcorner/
Дата: 14.01.03 06:38
Оценка:
Здравствуйте, pgerald, Вы писали:

P>Привет All!


P>В проге использую Excel для вывода отчетов — все работает на ура.


Ты всё сделал правильно, но после excel.Quit, возможно, стоит добавить

using System.Runtime.InteropServices;

...
excel.Quit
if(Marshal.IsComObject(excel))
{
Marshal.ReleaseComObject(excel);
excel = null;
}

Думаю, это полностью решить твою проблему.
С уважением,
Акжан, http://www.akzhan.midi.ru/devcorner/ — мой уголок разработчика
Re[2]: Помогите: Excel не выгружается из памяти
От: pgerald  
Дата: 14.01.03 06:41
Оценка:
K>[]

K>excel = null


Пробовал — не помогает
Re[2]: Помогите: Excel не выгружается из памяти
От: pgerald  
Дата: 14.01.03 06:46
Оценка:
Здравствуйте, Akzhan, Вы писали:

A>excel.Quit

A>if(Marshal.IsComObject(excel))
A>{
A> Marshal.ReleaseComObject(excel);
A> excel = null;
A>}

A>Думаю, это полностью решить твою проблему.


Спасибо — попробую.
Вот тока... Откуда "берется" этот код?
Я в том смысле, что — почему надо так делать?
"Обьект" вроде освобожден (если явно дать ему null и вызвать сборщика мусора) и должен
"умереть"...
Re[3]: Помогите: Excel не выгружается из памяти
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.01.03 06:01
Оценка:
Здравствуйте, pgerald, Вы писали:

P>"Обьект" вроде освобожден (если явно дать ему null и вызвать сборщика мусора) и должен

P>"умереть"...

СОМ объект это unmanaged ресурс.
... << RSDN@Home 1.0 beta 4 (developer build)>>
AVK Blog
Re[2]: Помогите: Excel не выгружается из памяти
От: pgerald  
Дата: 15.01.03 06:04
Оценка:
Здравствуйте, 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?
Re: Помогите: Excel не выгружается из памяти
От: filkov СССР  
Дата: 15.01.03 06:31
Оценка:
Здравствуйте, pgerald, Вы писали:

P>Но... почему-то после вывода отчета и команды Quit — excel остается висеть в процессах,

Оговорюсь, в .NET я — полный нуль. Но в СОМах я бы сделал так:

wb.Close();
excel.Quit();
wb.Release();
excel.Release();
Санкционный Смотритель.
Re: Попробуй закрыть коллекцию Книг
От: Vi2 Удмуртия http://www.adem.ru
Дата: 15.01.03 08:45
Оценка:
Здравствуйте, pgerald, Вы писали:

P>wb = excel.Workbooks.Open(nameXlsFile, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value,
P> Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value,
P> Missing.Value, Missing.Value, Missing.Value);

А попробуй закрыть(очистить) коллекцию Книг? Ну чтобы там не было измененных Книг или вообще Книг.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Попробуй закрыть коллекцию Книг
От: pgerald  
Дата: 15.01.03 08:48
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>

P>>wb = excel.Workbooks.Open(nameXlsFile, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value,
P>> Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value,
P>> Missing.Value, Missing.Value, Missing.Value);

Vi2>А попробуй закрыть(очистить) коллекцию Книг? Ну чтобы там не было измененных Книг или вообще Книг.

дать wb.Close(...) что ли?
пробовал, не помогает...
Re: Помогите: Excel не выгружается из памяти
От: Kell  
Дата: 15.01.03 09:06
Оценка:
Здравствуйте, pgerald, Вы писали:


а попробуй создать не Excel.Application(), а Excel.ApplicationClass()
а потом его quit
Re[2]: Помогите: Excel не выгружается из памяти
От: pgerald  
Дата: 16.01.03 05:44
Оценка:
Здравствуйте, Kell, Вы писали:

K>а попробуй создать не Excel.Application(), а Excel.ApplicationClass()

K>а потом его quit

Попробовал — нифига — воз и ныне там.
дошел уже до того, что делаю Marshal.ReleaseComObject и для workbook и для worksheet обьектов.
(даже для Range делал

Есть еще какие-нить мысли как заставить работать?
Неужели у всех работает без проблем связка C#-Excel?
Re[3]: Помогите: Excel не выгружается из памяти
От: Pavel Kalyakin http://www.livejournal.com/users/pavelk/
Дата: 16.01.03 07:36
Оценка:
Здравствуйте, pgerald, Вы писали:

K>>[]


K>>excel = null


P>Пробовал — не помогает


Я в свое время, столкнувшись с этой проблемой — надо было экспорт / импорт файлов Excel в WEB приложении сделать, побороть проблему так и не смог, в результате чего сделал так:
основная софтина вывешивает семафор — в моем случае это был файл.
на сервере по шедулеру запускается другая прилада, которая при старте смотрит на наличие файла. Если файл есть, то поднимает Excel,делает свои дела и отваливается. В этом случае Excel из памяти выносится.
... << RSDN@Home 1.0 beta 1 >>
Павел Калякин, MCDS.NET, MCS
http://www.livejournal.com/users/pavelk — Мой блог
Re: Помогите: Excel не выгружается из памяти
От: kreek  
Дата: 17.01.03 06:13
Оценка:
Здравствуйте, pgerald, Вы писали:

P>Привет All!


хъ

Я баловался с аксесом, было давно, но кажется при дебаге аксес оставался висеть в процессах.
Потом сделал обертку для аксес класса с реализацией деструктора и интерфейса IDisposable и все заработало.
... << RSDN@Home 1.0 beta 3 >>
Re: Помогите: Excel не выгружается из памяти
От: pukapin  
Дата: 09.04.05 21:10
Оценка:
Данная проблема решается, если посылать твоему Excel процессу windows сообщение WM_CLOSE.
Re[2]: Помогите: Excel не выгружается из памяти
От: _FRED_ Черногория
Дата: 10.04.05 00:46
Оценка:
Здравствуйте, pukapin, Вы писали:
P>Данная проблема решается, если посылать твоему Excel процессу windows сообщение WM_CLOSE.

А можно на пример взглянуть??
А если объект создан на другой машине?
Ultra playing "<< silent >>"
<< RSDN@Home 1.1.4 beta 4 rev. 391 >>
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Помогите: Excel не выгружается из памяти
От: squiz  
Дата: 10.04.05 07:58
Оценка:
Здравствуйте, pgerald, Вы писали:

P>Неужели у всех работает без проблем связка C#-Excel?


Это старая проблема. Поискав по форуму веток 6 найдется точно (длиннющих). Это не работает не только в C#, не работает это как бы ты его и откуда не вызывал.
Never underestimate those behind you...
Re[3]: Помогите: Excel не выгружается из памяти
От: pukapin  
Дата: 10.04.05 18:11
Оценка:
Здравствуйте, _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 window
    If 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 Long
   Dim 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> А если объект создан на другой машине?

С этим не сталкивался, не знаю.


Напиши пример на С#, если вздумаешь пойти этим путем, мне интересно посмотреть...
Re[2]: Помогите: Excel не выгружается из памяти
От: squiz  
Дата: 10.04.05 19:26
Оценка:
Здравствуйте, pukapin, Вы писали:

P>Данная проблема решается, если посылать твоему Excel процессу windows сообщение WM_CLOSE.


Только надо все же не забывать что будет если

а) было запущено несколько процессов Excel
б) если вы присоединяетесь к рабочему процессу Excel для генерации отчета, но прежде там были открыты другие книги.
Never underestimate those behind you...
Re[3]: Помогите: Excel не выгружается из памяти
От: pukapin  
Дата: 10.04.05 19:41
Оценка:
Здравствуйте, squiz, Вы писали:

S>Здравствуйте, pukapin, Вы писали:


P>>Данная проблема решается, если посылать твоему Excel процессу windows сообщение WM_CLOSE.


S>Только надо все же не забывать что будет если


S>а) было запущено несколько процессов Excel

S>б) если вы присоединяетесь к рабочему процессу Excel для генерации отчета, но прежде там были открыты другие книги.

Согласен.
Желательно создавать свой процесс.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.