2010-05-15 2 views
0

Я написал следующий код в предположении, что Excel будет умереть с мартышки:Гарантированный выпуск COM-объекта?

class ExcelMonkey 
{ 
    private static Excel.Application xl = new Excel.Application(); 

    public static bool parse(string filename) 
    { 

     if (filename.Contains("foo")) 
     { 
      var workbook = xl.Workbooks.Open(filename); 
      var sheet = workbook.Worksheets.get_Item(1); 

      // do stuff 

      return true; 

     } 

     return false; 
    } 
} 

Как убедиться, что он делает? Нужно ли мне выпускать workbook и sheet отдельно?

Я хочу иметь Excel в течение всей жизни программы, это огромное улучшение производительности.

+0

Это на самом деле дубликат. См. Http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c –

ответ

2

Должен ли я освобождать книгу и лист отдельно?

Да, либо будет сохраняться основной объект приложения Excel.

Как я могу убедиться, что это так?

Marshal.ReleaseComObject будет делать это, но не заставляйте ссылаться на объект после этого.

1

Вот рабочее решение, в случае, если кто интересуется:

class ExcelMonkey 
{ 
    private Excel.Application xl = new Excel.Application(); 

    ~ExcelMonkey() 
    { 
     xl.Quit(); 
     Dispose(false); 
    } 

    private bool isDisposed = false; 


    protected void Dispose(bool disposing) 
    { 
     Marshal.ReleaseComObject(xl); 
     isDisposed = true; 
    } 

    public bool parse(string filename) 
    { 
     if (filename.Contains("foo"))     
     { 
      var workbook = xl.Workbooks.Open(filename); 
      var sheet = workbook.Worksheets.get_Item(1); 

      try 
      { 
       // do stuff 
      } 
      finally 
      { 
       Marshal.ReleaseComObject(sheet); 
       Marshal.ReleaseComObject(workbook); 
      } 
      return true; 
     } 
     return false; 
    } 
} 
1

По пути немного фона, Excel имеет тенденцию генерировать скрытые ссылки за кулисами как функции COM нарушившим механизмов, используемых для поддержка VBA. Например, вы можете поговорить с «Приложением», и он спокойно установил ссылку на COM, с которой вы не могли бы отключиться.

Вы все еще должны быть очень дотошны при использовании ссылок COM при программировании Excel.

Это усугубляется тем фактом, что PIA также любят генерировать ссылки за кулисами, и они не прибирают эти ссылки должным образом при сборке мусора. Вы должны явно закрыть любую ссылку на COM.

1

Если вы хотите работать с офисными файлами, я рекомендую вам взглянуть на NPOI lib. Это точечный сетевой порт POI lib для java, который он работает при работе с офисными файлами. Никакой беспорядочный COM не нужен, все сделано в коде CLR, все работает так, как ожидалось.

Я использую его для генерации отчетов Excel без проблем. Попробуй, я уверен, ты не пожалеешь об этом. Гораздо лучше, чем использование COM

Смежные вопросы