■ RichEditControl 클래스에서 COPY/PASTE 편집시 관리 디버깅 도우미 "DisconnectedContext" 오류를 처리하는 방법을 보여준다.
RichEditControl에서 일정 크기의 서식을 갖는 문자열을 복사하고 붙여넣기 하는 과정에서 COM 에러가 발생하는데 AppDomain 클래스의 UnhandledException 이벤트나 Application 클래스의 ThreadException 이벤트에도 잡히지 않고 프로그램이 다운되는 경우가 자주 발생했다.
▶ 예외 메시지
1 2 3 4 5 6 7 8 9 |
관리 디버깅 도우미 'DisconnectedContext' 메시지=관리 디버깅 도우미 'DisconnectedContext' : '다음 오류로 인해 이 RuntimeCallableWrapper에 대한 COM 컨텍스트 0x65571548(으)로의 전환이 실패했습니다. 개체가 서버에 연결되지 않았습니다. (예외가 발생한 HRESULT: 0x800401FD (CO_E_OBJNOTCONNECTED)). 일반적으로 이 RuntimeCallableWrapper가 생성된 COM 컨텍스트 0x65571548의 연결이 끊어졌거나 다른 작업을 수행하고 있어 컨텍스트 전환을 진행할 수 없기 때문입니다. COM 구성 요소에 대한 요청을 처리하는 데 프록시가 사용되지 않으며 COM 구성 요소를 직접 호출합니다. 이로 인해 손상 또는 데이터 손실이 발생할 수 있습니다. 이 문제를 방지하려면 응용 프로그램 내부의 COM 구성 요소를 나타내는 RuntimeCallableWrappers의 작업이 응용 프로그램에서 완료될 때까지 모든 COM 컨텍스트/아파트/스레드를 활성화된 상태로 유지하고 컨텍스트 전환에 사용할 수 있도록 하십시오.' |
▶ 발생 원인
1 2 3 4 5 |
DevExpress의 답변을 찾아보면 DisconnectedContextException은 다른 어플리케이션에 의해 클립보드가 잠길 때 발생한다고 하는데, 예외를 발생시키기 위해 RichEditControl에서 Copy & Paste 작업을 반복하고 있으면 디버깅 창에서 수시로 스레드가 종료되는 것을 볼 때, 이 과정에서 클립보드가 잠겨지는 것으로 추정된다. |
◆ 조치 사항
1. [Visual Studio]에서 소스 코드를 로드한다.
2. [CTRL] + [ALT] + [E] 키를 눌러 [예외 설정] 창을 표시한다.
3. Managed Debugging Assistants 항목에서 아래 항목들을 체크 해제한다.
. ContextSwitchDeadlock
. DisconnectedContext
4. 소스 코드를 다시 빌드한다.