2010-03-04 5 views
5

최근에 저는 다양한 Visual Studio Extensions 프로젝트를 작성하는 데 많은 시간을 보냈습니다. 프로젝트가 핵심 VS 서비스에 액세스하는 모든 관리 코드이지만 이전 스타일의 COM 인터페이스로 작업해야합니다.COM interop 참조 카운팅 가이드

var selectionTracker = (IVsMonitorSelection)serviceProvider.GetService(typeof(SVsShellMonitorSelection)); 
IntPtr ppHier; 
uint pitemid; 
IVsMultiItemSelect ppMIS; 
IntPtr ppSC; 
selectionTracker.GetCurrentSelection(out ppHier, out pitemid, out ppMIS, out ppSC))) 

이 호출이 2 포인터 (ppHier 및 ppSC)와 객체 ppMIS를 반환 볼 수 있습니다 : 여기

은 예입니다. 질문 : COM 참조 카운팅으로 어떻게하면 좋을까요?

COM 세계에서 메서드가 개체에 대한 포인터를 반환하면이 포인터는 반환되기 전에 AddRef로 처리됩니다. 즉, COM 객체 누출을 방지하기 위해 COM 개체 누출을 막을 때 해제해야합니다.

나는 또한 개체가 이미 RCW에 래핑 된 것으로 가정합니다.이 개체는 완성되었을 때 참조를 처리합니다.

위의 호출에 적용된이 2 가지 가정은 내 2 포인터에서 'Marshal.Release'를 호출해야한다는 것을 의미하지만, 반환 된 개체와 관련하여 참조 계산에 관해서는 안됩니다.

내 질문에 대한 답변 : COM 규칙에 따라 사용중인 COM 개체가 있다고 가정하면 COM 참조 계산을 올바르게 처리 할 수 ​​있습니까?

답변

0

이 특정 시나리오에서 당신은 그렇지 않으면 사라지지 않을 것입니다 을 IntPtr 변수에 에게 Marshal.Release를 호출해야합니다. 물론 marshaller에게 객체 (또는 특정 유형)를 직접 사용하도록 지시하면 RCW가 객체가 미래의 어느 시점에서 파괴되지 않도록 보장하므로 걱정할 필요가 없습니다 (즉 finalizer가 호출 될 때). 가비지 수집 프로세스). 종료 자 접근 방식은 시간 비 결정적 지점에서 일어날 수 물론

는 객체를 사용하면 이상적 래퍼 전에 참조 카운트를 감소시킬 Marshal.ReleaseComObject를 호출해야합니다 당신을 제거 할 필요가 일부 자원을 유지, 그래서 만약 당신을 위해 석방 하죠.