Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > удаление Excel.exe процесса на сервере


Автор: lirikKS86 6.10.2011, 22:42
Добрый день коллеги!
При загрузке данных на сервер из Excel столкнулся со следующей проблемой. Пользователь выбирает файл *.xls, 
после чего он загружается на сервер и считывается с помощью объекта  Microsoft.Office.Interop.Excel (примерный код):
     objExcel = new Excel.Application();
     Excel.Workbook objWorkBook = objExcel.Workbooks.Open(strNewPath, 
                                             Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                                             Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                                             Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                                             Type.Missing, Type.Missing);
      Excel.Sheets excelsheets = objWorkBook.Worksheets;
      Excel.Worksheet sheet = (Excel.Worksheet)excelsheets.get_Item(1);
      while(true)  {  //считываем файл   }
  Далее закрываю объект objExcel и удаляю загруженный файл:
    objExcel.Quit();
    //удаляем файл
    File.Delete(strNewPath);
  Все проходит, а процесс, порожденный вызовом objExcel = new Excel.Application() висит в диспетчере задач с именем
  EXCEL.EXE. При повторной загрузке, создается еще один процесс с именем EXCEL.EXE. 
    Необходимо как-то по имени загруженного на сервер файла .xls удалить процесс EXCEL.EXE,которым он занят. 
    Буду благодарен за любые идеи и решения этой проблемы. За раннее благодарю за помощь!!!!

Автор: jonie 6.10.2011, 23:17
objWorkBook.Dispose() делайте +  Marshal.ReleaseComObject(objWorkBook) и для ЛЮБЫХ объектов которые вы создавали (включая ранджи и т.д.)

Я напомню что xl.Page.Range - тут создаются  ДВА объекта - Page и Range. И их оба надо отдельно удалять, т.е. писать так:
Код

var page = xl.Page;
var range = page.Range;
...
range.Dispose();
Marshal.ReleaseComObject(range);

page .Dispose();
Marshal.ReleaseComObject(page);
....
xl.Quit();
  GC.GetTotalMemory(false);  
  GC.Collect();  
  GC.WaitForPendingFinalizers(); 
  GC.Collect();  
  GC.GetTotalMemory(true);  

Автор: lirikKS86 7.10.2011, 07:30
Большое спасибо jonie. Сейчас попробую реализовать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)