2009-09-03 9 views
5

How to properly clean up excel interop objects in c#에 대한 질문입니다.C에서 interop 개체를 올바르게 정리하는 방법

Excel 네임 스페이스 내에서 체인 호출 (예 : ExcelObject.Foo.Bar())을 함께 사용하면 COM 개체의 가비지 수집을 방지 할 수 있습니다. 대신 명시 적으로 사용되는 각 COM 개체에 대한 참조를 만들고 Marhsal.ReleaseComObject()를 사용하여 명시 적으로 해제해야합니다.

Excel COM 개체에만 연결된 연결 후 COM 개체를 해제하지 않는 동작입니까? COM 객체가 사용 중일 때마다 이런 종류의 패턴을 적용하는 것이 과도한가?

답변

6

두 가지 이유로 Office 응용 프로그램을 처리 할 때 다른 COM 라이브러리보다 제대로 릴리스를 올바르게 처리하는 것이 중요합니다.

  1. Office 응용 프로그램은 in-proc 라이브러리가 아닌 out-of-process 서버로 실행됩니다. 제대로 정리하지 못하면 프로세스가 실행 중입니다.
  2. COM 개체에 대한 해결되지 않은 참조가있는 경우 Application.Quit를 호출해도 Office 응용 프로그램 (특히 Excel IIRC)이 제대로 종료되지 않습니다.

정상적인 in-proc COM 라이브러리의 경우 제대로 정리하지 못한 결과는 그리 극적이지 않습니다. 프로세스가 종료되면 모든 in-proc 라이브러리가 사라집니다. 그리고 더 이상 객체를 필요로하지 않을 때 객체에서 ReleaseComObject를 호출하는 것을 잊어 버리면 객체가 완성 될 때까지 결국 처리됩니다.

그건 말하지만, 이것은 엉성한 코드를 쓰는 핑계가 아닙니다.

+0

아주 좋은 점 RE : 왜 사무실 interop 개체를 정리해야합니까? –

2

COM 개체는 기본적으로 관리되지 않는 코드이므로 관리되는 응용 프로그램에서 관리되지 않는 코드를 호출하자 마자 해당 관리되지 않는 코드를 정리하는 것은 사용자의 책임입니다.

요약하면 위 게시물에 링크 된 패턴은 모두 COM 개체에 필요합니다.

+0

... "필요한 것"의 정의가 있습니다. 프로세스 종료 (또는 앱 도메인 언로드, 먼저 발생한다면), 아직 파괴되지 않은 모든 RCW (런타임 호출 가능 래퍼)가 출시 될 것입니다. 불행히도, 그들 주위에 강력한 보장이 제대로 파괴되고 모든 finalizer가 실행되는 것은 아닙니다. 다른 것들 중에서도 COM 객체를 파괴하는 데 2 ​​초 이상이 걸리면 CLR은 해당 스레드에서 실행되는 finalizer 큐 전체를 종료합니다. – reuben

+2

@Reuben, 질문을 읽어주십시오. 질문에 대한 대답은 100 % 정확하지만 COM에 대한 훌륭한 본질적인 내용은이 질문과 아무 관련이 없습니다. –

관련 문제