2010-04-02 4 views
6

최근까지 .NET 런타임은 runtime-callable wrapper을 만들 때 COM 개체의 참조 횟수를 1만큼만 늘리고 특정 COM 개체에 대해서는 런타임 호출 가능 래퍼 하나만 만들 것이라고 믿었습니다..NET 런타임은 COM 개체에 대한 참조 횟수를 1보다 많이 유지합니까?

제가 실수가 아니라면, 위의 내용은 실제로 Marshal.FinalReleaseComObjectMarshal.ReleaseComObject이 동일한 것을 의미합니다.

그러나 오늘은 코드에서 COM 개체가 제대로 릴리스되었는지 확인하기 위해 몇 가지 테스트를 작성했습니다. 나는 이것을 공개 할 객체를 호출하고 예상 된 InvalidComObjectException을 검사합니다. FinalReleaseComObject 다음에 예외가 발생하지만 ReleaseComObject 다음에 예외가 발생하는 경우가 있습니다.

즉, .NET 2.0 런타임에서 COM 개체에 대한 참조를 둘 이상 보유 할 수 있습니까? 그렇다면 언제 이것을합니까?

답변

5

여기에는 추가 수준의 간접 참조가 있습니다. 예, RCW는 기본 COM 인터페이스 포인터에 대한 단일 참조 횟수를 유지합니다. 그러나 RCW도 참조 카운트를 가지고 있으며, COM 인터페이스 포인터가 RCW에 매핑 될 때마다 증가합니다. COM 메서드가 인터페이스 포인터를 반환하면 어떤 일이 발생할 수 있습니다. 해당 .NET 래퍼 클래스의 finalizer가이를 줄입니다.

Marshal.ReleaseComObject()는 finalizer와 같이 하나씩 감소시키고 Marshal.FinalReleaseComObject()는 0으로 설정하여 IUnknown :: Release()를 보장합니다.) 메서드가 호출됩니다. 그들은 물론 "당신이하고있는 일을 잘 알고 있습니다"범주에 속합니다. 잘못 입력하면 추락하는 undebuggable "COM 개체가 기본 RCW와 분리되어"예외가 발생합니다.

관련 문제