2015년 9월 21일 월요일

[ C# ] Com 오브젝트 참조 카운트 해제

COM 객체를 다룰 때 참조 카운트의 해제를 의식해야합니다. 사용한 COM 개체의 참조 카운트가 제대로 감소되지 않으면 의도 한 타이밍에서 프로세스가 해제되지 않습니다.
참조 카운트의 감소는 System.Runtime.InteropServices.Marshal 클래스의 ReleaseComObject 메서드를 사용합니다. COM 래퍼 객체 (COM 그 것은 아니다)의 참조가 미 도달하게되면 가비지 컬렉션을 수행하고 방출 할 수 있으며,이 경우는 어디 까지나 보험입니다.
참조 카운트 감소 해방 자체는 ReleaseComObject 메서드를 호출 할뿐입니다 때문에 어렵지 않습니다. 귀찮은 것은 ReleaseComObject 메서드를 실행하기 위해 참조하는 것을 모든 변수에 저장 해 둘 필요가 있다는 점입니다. 이 점, COM 전용 언어 인 Visual Basic 6 이전과는 전혀 사정이 다르기 때문에 주의해야합니다.
또한 처리 도중 예외가 발생했을 경우에도 참조 카운트를 감소하기 위해 try ~ finally많이 하게 됩니다. 일련의 흐름을 하나의 메소드로 표현하면 아무래도 가독성이 나빠져 버립니다.

개인적으로는 COM을 다룰 때는 COM 전용 언어로 구현하는 것이 좋습니다. VBA 측 매크로를 .NET 응용 프로그램에서 호출하는 방법, VB 또는 VBScript 처리를 구현하고 호출하는 방법 또는 ScriptControl을 이용하는 방법이 있습니다. 이러한 방법이라면 참조 카운트 번거 로움 그만큼 번거 로움이 없습니다.

댓글 없음:

댓글 쓰기