2014-01-21 9 views
1

Я пытаюсь обернуть Excel.ApplicationClass в интерфейсе IDisposable, чтобы он автоматически закрывался после использования. Что у меня есть что-то вроде следующего:Excel Interop неожиданно открывает второй экземпляр Excel

module Excel = 
    type Application() = 
     member private this.excel = new Excel.ApplicationClass() 

     interface IDisposable with 
      member this.Dispose() = 
       this.excel.Quit() 
       Marshal.ReleaseComObject(this.excel) |> ignore 

Когда я зову его в функцию как

let func = 
    use ex = new Excel.Application() 
    () 

Два экземпляра Excel запускаются (я могу увидеть в моем диспетчере задач), но только один из них снова закрываются. Может ли кто-нибудь сказать мне, что я здесь делаю неправильно?

ответ

3

Свойство this.excel создает новый процесс Excel каждый раз, когда он оценивается, поэтому вызов Dispose создает один процесс, а затем немедленно завершает работу, а другой процесс только для вызова Marshal.ReleaseComObject. Эта вторая, вероятно, та, что остается в живых.

Изменить код на что-то вроде этого:

module Excel = 
    type Application() = 
     let m_excel = new Excel.ApplicationClass() 

     member private this.excel = m_excel 

     interface IDisposable with 
      member this.Dispose() = 
       this.excel.Quit() 
       Marshal.ReleaseComObject(this.excel) |> ignore 
+0

Отлично! Спасибо огромное! – torbonde

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