2011-04-08 4 views
1

COM Interop .NET 어셈블리 (COM 호출 가능 래퍼)를 프로그래밍 중이며 올바른 방법으로 발생한 오류를 전달하는 것이 무엇인지 이해하려고합니다. COM 클라이언트/소비자에 대한 .NET 어셈블리. 이것이 내 질문을 많이 변경시키지 않았는지는 모르겠지만이 특정 .NET 어셈블리는 기존의 오픈 소스 FTP 라이브러리를 가져 와서 COM의 하위 집합을 COM에 노출하고 있습니다. 대부분의 경우 간단하고 "벙어리"래퍼입니다..NET 어셈블리에서 COM 클라이언트/소비자에 대한 오류 처리 또는 전달

오류 처리를 프로그래밍하는 가장 좋은 방법은 COM 클라이언트/소비자가 오류 이벤트를 구독하는 데 사용할 수있는 .NET 어셈블리 안에 공개 OnError 이벤트를 포함시키는 것입니다. 그런 다음 이벤트를 사용할지 여부와 처리 방법을 결정하기 위해 COM에서 프로그래밍하는 것이 좋습니다. COM 프로그래머가 오류 이벤트 처리기를 생략하고 .NET 어셈블리 내에서 발생하는 오류에 대한 인식이 없기 때문에 다소 위험 할 수 있습니다. 이 .NET 어셈블리는 매우 일반적이기 때문에 .NET 어셈블리에서 메시지 상자를 가져 오거나 COM 소비자가 거의 또는 전혀 제어 할 수없는 다른 방법으로 오류를 처리하는 것을 원치 않습니다.

이 방법이나 표준 방법을 처리하는 더 좋은 방법이 있습니까?

답변

1

이 작업을 표준 .NET 방식으로 수행하고 예외를 throw하십시오. CCW 래퍼는 그것을 포착하고 모든 COM 메서드가 반환하는 HRESULT 코드로 변환합니다. 또한 COM 클라이언트가 오류에 대한 설명을 잘 볼 수 있도록 IErrorInfo를 구현합니다. 명백한 예외가 아니라면 예외 생성자에서 예외를 전달하는 것을 잊지 마십시오. 그들은 거의 번역되지 않을 때가 많습니다.

가능하면 표준 .NET 예외 유형을 사용하십시오. 그들은 모두 자신의 HResult 속성 값을 미리 설정하여 가능한 한 최상으로 COM 오류 코드에 매핑합니다. 사용자 지정 HRESULT가 필요하면 COMException (string, int) 생성자를 사용하십시오.

+0

이것은 의미 있고 효과적입니다. 나는 여전히 .NET의 신참인데 어디서 엉망이되었는지는 내가 책을 읽고 자습서를보고 실제로 뭔가를하는 코드가 try/catch 블록 안에 있어야한다는 것을 분명히하는 것입니다. 나는 여기에 앉아서 생각하고있다. 이제 예외를 잡았고, 나는 그것을 어떻게하면 좋을까? 그런 다음 나는 그것을 전달할 미친 계획을 세워야했습니다. 간단한 해결책은 COM 클라이언트/소비자에게 오류를 전달할 수 있도록 try/catch 블록을 제거하는 것이 었습니다. – HK1

관련 문제