2010-06-16 4 views
1

Я использую указанный вызов, чтобы освободить некоторые объекты Excel после того, как я закончил. Нужно ли устанавливать ссылки на нуль после (например, в следующем коде)?Marshal.ReleaseComObject (...) issues

var dateCol = sheet1.get_Range("C4", "C" + rowOffset); 
dateCol.NumberFormat = "Text"; 
Marshal.ReleaseComObject(dateCol); 
dateCol = null; 
+2

Excel Interop немного черной магии , ИМХО. Нуль не болит. – Nate

ответ

1

Это то, что я всегда использую, и она работает очень хорошо

using Excel = Microsoft.Office.Interop.Excel; 

    Excel.ApplicationClass _Excel; 
    Excel.Workbook WB; 
    Excel.Worksheet WS; 

try 
    { 

    _Excel = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
    WB = _Excel.Workbooks.Open("FILENAME", 
     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); 

     //do something 

    } 
    catch (Exception ex) 
    { 
     WB.Close(false, Type.Missing, Type.Missing); 

     throw; 
    } 
    finally 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(WB); 

     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_Excel); 


    } 

Делают

System.Runtime.InteropServices.Marshal.FinalReleaseComObject 

На всех ссылочного Excel объекты

+0

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