2014-07-15 4 views
1

Outlook COM-Addin이 VB.NET으로 작성되었지만 몇 가지 기존 VB6 라이브러리를 사용합니다.VB6 라이브러리에서 RaiseEvent를 통해 .NET에서 이벤트를 소비 할 때 이상한 동작이 발생했습니다.

Outlook에서 응용 프로그램을 실행할 때 .NET 추가 기능 라이브러리가 프로세스 (타사 응용 프로그램을 통해 호출 됨)에서로드 될 때 모든 것이 잘 작동하지만 내가 할 수없는 특정 문제가 발생합니다. 구제하는 것 같다.

VB6 라이브러리는 많은 Outlook API 작업을 처리하고 특정 조건이 충족 될 때 RaiseEvent를 통해 다시 이벤트를 .NET으로 실행합니다. 어떤 이유로 아웃 오브 프로세스 (out-of-process)를 실행할 때 한 특정 이벤트는 단순히 삼켜지고 앱의 실행은 단순히 중지됩니다. NET UI 스레드가 반응하지만 VB6 RaiseEvent 호출로 들어가 자마자 기본 코드 경로가 차가워집니다.

내가 디버거에서 처리 할 때도 동일한 문제가 발생합니다. 나는 (VB6에서) 사건에 발을 들여 놓았고 다른 쪽에서는 아무 것도 나타나지 않았다.

이벤트가 발생하기 전에 앱이 실행되는 동안 이벤트가 한 두 번 성공적으로 실행되므로 이벤트 당 성능 문제는 아니며 RaiseEvent가 호출되는이 특정 인스턴스에 불과합니다. 너무 이상합니다.

나를위한 중요한 문제는 오류가 발생하지 않는다는 것입니다. 모든 종류의 오류 처리 - VB6 끝과 .NET -에 RaiseEvent 호출을 예약하고 아무 것도 발생하지 않습니다. .NET에서 이벤트 처리기의 첫 번째 줄에 추적 로그를 설정하고 VB6의 RaiseEvent 호출 직전과 직후에 기록 된 유일한 줄은 RaiseEvent에 직접 앞선 레코드입니다.

내가 인식 할 수있는 문제가되는 코드 경로에 대한 유일한 요소 중 하나는 두 개의 서로 다른 이벤트가 다소 빨리 연속적으로 시작된다는 것입니다 (두 번째 이벤트는 실패한 이벤트 임). 나는 쓸모없는 수면 전화를 추가하려고했습니다.

이 문제를 자세히 진단하기 위해 무엇을 할 수 있는지 잘 모르겠습니다. VB6 실행을 위해 다른 스레드를 명시 적으로 생성하지는 않지만 .NET이 후드 아래에 있다고 생각하는 경향이 있습니다.

누구든지이 문제를 진단 할 수있는 방법에 대한 제안 사항이있는 경우 아이디어가 부족한만큼 모든 귀가 들었습니다.

업데이트 : 문제는 어떤 식 으로든 ContactItem 개체를 VB6의 첫 번째 이벤트로 전달하는 것과 관련이있었습니다. 전 객체를 필요로하지 않았고 속성 만 필요했습니다. 그래서 객체 전체 대신 문자열을 전송 했으므로 이제는 제대로 작동합니다. .NET/COM 재미.

+1

'Thread.CurrentThread.ManagedThreadId'는 레거시 VB6 객체를 작성한 지점과 그 어디에서든지 호출합니다. 또한 .NET 측에서 이벤트를 처리 할 수 ​​있습니다. 'ManagedThreadId'는 어디서나 동일하게 유지됩니까? – Noseratio

+1

나는 그것을 시험해 보았다. ManagedThreadID는 모든 지점에서 '1'입니다. 나는 또한 일관성있는 VB6 측에도 스레드 ID를 로깅한다. – RyanMac

+0

위의 내용을 이해하십시오. 댓글을 감사드립니다. – RyanMac

답변

0

문제는 어떤 식 으로든 ContactItem 개체를 VB6의 첫 번째 이벤트로 전달하는 것과 관련이 있습니다. 전 객체를 필요로하지 않았고 속성 만 필요했습니다. 그래서 객체 전체 대신 문자열을 전송 했으므로 이제는 제대로 작동합니다. .NET/COM 재미.