1. COM 개체란 무엇인가?
COM은 개체가 단일 프로세스 내에서처럼 프로세스 및 컴퓨터 경계를 넘어
쉽게 상호 작용할 수 있도록 하는 기술이다.
예로 들자면 프로그램에서 '클립보드', '파일' 에 접근 할 때
COM 개체를 통해 접근 하는것이다.
Clipboard.GetDataObject();
// or
OpenFileDialog();
물론 이와 같은 형태의 COM 개체만 존재하는것은 아니다.
COM 개체는 직접 만들어서 등록할수도 있다.
2. COM 개체를 사용할 때 Thread 안정성에 주의하자.
아래 두가지 답변을 통해 많은 내용을 배웠다.
위 답변들의 내용을 요약하면
COM과 .NET은 별개이며 .NET이 COM 클래스를 이용할때 'COM 클래스에 대한 스레딩 보장을 무시' 한다. COM 클래스는 어떤 종류의 스레딩 요구사항이 존재하는지 이를 게시할 수 있지만 .NET에는 COM이 어떤 스레딩 요구사항을 지니는지 관심이 없다는 의미이다. 결국 .NET, COM 간의 통신에 있어서 어떤 문제가 생기면 그냥 Runtime Error 를 내뿜으며 프로그램이 뻗는다는 의미이기도 하다.
때문에 COM 개체를 이용할 때 이러한 이해 없이 COM 개체와의 Thread 안정성을 고려하지 않으면 '원인을 찾기 어려운 골아픈 에러' 가 발생한다. 예를들어, STA가 필요한 두가지 로직을 순차적으로 운용하면서, 둘 사이에 Thread.Sleep() 을 사용하는경우가 바로 그 경우이다. Thread.Sleep() 는 명확히 말해서 '차단' 이다. 이럴경우 스레드를 임의로 '중단' 처리하고 메서드 호출을 강제로 수행하는 형태의 꼴이 되 버리기 때문에 심각한 재진입 문제가 발생할 수도 있다 (사용하는 COM 개체에 따라 문제가 발생하지 않을 확률도 존재한다)
결론적으로 OpenClipboard Failed 같은 에러나, System.Runtime.InteropServices.InvalidComObjectException: 'COM object that has been separated from its underlying RCW cannot be used.' 같은 에러들은 이와 같은 문제로 인해 발생할 확률이 있다.
'Programming' 카테고리의 다른 글
Endian 변환 과정에 대하여 (0) | 2021.10.28 |
---|---|
코딩 네이밍 규칙 (0) | 2021.07.22 |