2011-02-18 4 views
0

클래스 수준의 Excel 개체가 정의 된 클래스가있는 아래 코드가 있습니다. 다른 클래스에서 excelModule.Test를 호출하면 이 모든 Excel 개체가 만들어지고 작업 관리자에서 Excel 인스턴스를 볼 수 있습니다.Excel 응용 프로그램 개체를 해제하는 방법

이러한 개체를 해제 할 클래스에 대해 unload 이벤트가 있습니까?

Module excelModule 
    Public myRange As Excel.Range 
    Public mySheet As Excel.Worksheet 
    Public wb As Excel.Workbook 
    Public ex As New Excel.Application 

    Public Sub Test() 

    End Sub 
End Module 
+1

COM 개체를 해제하는 방법을 묻는 질문이 있으십니까? COM 객체의 .NET 래퍼는'IDisposable'을 구현한다고 생각합니다. 객체 사용을 마쳤 으면'Dispose'를 호출 할 수 있어야합니다. –

+1

@Ben, 런타임 호출 가능 래퍼 (RCW 's)는 IDisposable을 구현하지 않습니다. 그들은 finalizers가 있지만 그들은 처형 수 없습니다. – Josh

답변

4

동안, 또한 응용 프로그램이 생성되기 전에 사용자가 Excel을 열고 있기 때문에 경우에 결함이있어 작동 할 수 종료 호출의 로버트의 제안 Application 개체를 종료 한 다음 Quit을 호출하면 열려있는 Excel 인스턴스가 종료됩니다.

문제는 COM 응용 프로그램이 Excel 응용 프로그램 개체에 대한 참조를 완료했는지 여부를 알 수 없다는 것입니다. 범위를 벗어나 가비지 수집/마무리 작업에 적합하더라도 최종 마무리 작업은 즉시 이루어지지 않습니다.

드문 경우이지만 COM 개체에서 Marshal.FinalReleaseComObject을 호출해야하지만 대부분이 경우는 필요하지 않습니다.

그래서 가비지 수집을 명시 적으로 트리거하는 동안 거의 항상 싫증이 나기는하지만 실제로는 .NET/COM interop에서 필요합니다. 더 이상 Excel 개체에 대한 참조가 없는지 확인한 후 시도하십시오.

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
1

관리되지 않는 리소스를 사용하고 있기 때문에 모듈을 클래스로 변경하고 해당 클래스에서 IDisposable 인터페이스를 구현해야합니다. Dispose 메서드에서는 Excel 개체를 올바르게 처리해야합니다. 당신이 당신의 엑셀 포장 클래스를 사용할 때

다음, Using 블록에 그렇게 :

Using e as New ExcelWrapper() 
    e.Test() 
End Using 
+0

래퍼 IDisposable 만들기 실제로 COM 개체를 해제하려면 뭔가를 않는 한 COM 개체의 수명에 영향을 미치지 않습니다. – Josh

+0

알아. 그래서 "Dispose 메서드에서 Excel 개체를 올바르게 처리해야합니다."라고 말한 것입니다. :] –

+0

하지만 그게 내 포인트 야. 어떻게 그 제안을하는거야? COM 개체에는 Dispose 메서드가 없습니다. – Josh

관련 문제