2009-09-18 3 views
0

엑셀 시트를 가져 오는 도구를 만들었습니다. 엑셀 COM 개체는 앱의 수명 동안 생성됩니다. 내 도구에 MVP 패턴을 적용하여 VIEW와 Presenter가 UI와 로직을 분리하도록했습니다..NET에서 Excel COM 개체를 해제 할 수 없습니다.

WinForm 인 vIEW는 Deisgner 코드에서 재정의 된 From 클래스의 상속으로 인해 Dispose() 메서드를 사용하고 있습니다.

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
     _presenter.Dispose(); 
    } 

그게 말 그대로 내가 자체가 관리되지 않는 COM 개체를 포함 아직 관리 코드이지만, 내 발표자, O를 내 처분 호출을 삽입 할 곳.

발표자

다음이를 수행하여 COM 개체를 해제하려고 :

public void Dispose() 
    { 
     Int32 countDown = 1; 
     while (countDown > 0) 
      countDown = Marshal.ReleaseComObject(_excelObj); 
    } 

난 아무것도 가져 오지 않고 응용 프로그램을 열면 엑셀 과정은 TEH 응용 프로그램을 닫은 후 사라집니다. 시트를 가져 오기 위해 앱을 사용하는 경우 엑셀 개체가 더 이상 이동하지 않고 메모리에 남아 있습니다. 심지어 작업이 성공적으로 실행되거나 취소 된 경우에도 마찬가지입니다.

내가 더 저를 도와 좋은 링크를 발견,하지만 문제는 여전히 남아있다 : ​​도움을 How do I ensure that objects are disposed of properly in .NET?

감사합니다,

+0

답변을 게시하기에 충분한 세부 사항을 모르지만 Excel 개체 모델에 어딘가에 종료 메서드가 있습니까? 나는 Word의 객체 모델을 기억하고 있으며 서버를 언로드하기 위해 명시 적으로 호출해야한다고 생각합니다. –

답변

3

ReleaseComObject 대신 FinalReleaseComObject을 사용해보세요. FinalReleaseComObject는 ReleaseComObject가하는 것처럼 루프에서 사용할 필요가 없습니다.

다른 질문에 this reply을 자세히 보려는 경우 참조가 유지되지 않도록 다른 Excel 개체가 삭제 될 수 있으므로 가능성이 있습니다. 그 전체 질문은 도움이되지만 링크 된 게시물 특히 것들을 요약해야합니다.

+0

아 정확히 그게 내가 찾고 있던거야! 감사! –

-1

I했습니다 엑셀 COM 객체와 작업 할 때 이전과 같은 문제가 있었다. 응용 프로그램에서 수행해야하는 작업은 Dispose 메서드에 있으며 특히 Excel 프로세스가 실행 중인지 확인하고 수동으로 종료하십시오.

변경 사항을 먼저 저장했는지 확인하십시오.

+0

여기에 위험이 있습니다. 내 것과 무관 한 다른 Excel 시트가 이미 열려 있다면 어떻게 될까요? 그럼 내가 실수로 잘못된 프로세스를 죽일 것이고 느슨한 데이터. – Houman

관련 문제