이벤트 구독
이 연습에서는 실행 중인 문서 테이블(RDT)의 이벤트에 응답하는 도구 창을 만드는 방법을 설명합니다. 도구 창은 IVsRunningDocTableEvents를 구현하는 사용자 컨트롤을 호스트합니다. AdviseRunningDocTableEvents 메서드는 인터페이스를 이벤트에 연결합니다.
RDT 이벤트 구독
도구 창을 사용하여 확장을 만들려면
VSIX 템플릿을 사용하여 RDTExplorer라는 프로젝트를 만들고 RDTExplorerWindow라는 사용자 지정 도구 창 항목 템플릿을 추가합니다.
도구 창으로 확장을 만드는 방법에 대한 자세한 내용은 도구 창으로 확장 만들기를 참조하세요.
RDT 이벤트를 구독하려면
RDTExplorerWindowControl.xaml 파일을 열고
button1
이라는 단추를 삭제합니다. ListBox 컨트롤을 추가하고 기본 이름을 적용합니다. Grid 요소는 다음과 같이 표시됩니다.<Grid> <StackPanel Orientation="Vertical" Margin="-10,10,10,0"> <TextBlock Margin="10" HorizontalAlignment="Center">RDTExplorerWindow</TextBlock> <ListBox x:Name="listBox" Height="100" /> </StackPanel> </Grid>
코드 뷰에서 RDTExplorerWindow.cs 파일을 엽니다. 다음 using 지시문을 파일의 시작 부분에 추가합니다.
using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop;
ToolWindowPane 클래스에서 파생되는 것 외에도 IVsRunningDocTableEvents 인터페이스를 구현하도록
RDTExplorerWindow
클래스를 수정합니다.public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents {. . .}
IVsRunningDocTableEvents를 구현해야 합니다.
- 인터페이스를 구현합니다. IVsRunningDocTableEvents 이름에 커서를 놓습니다. 왼쪽 여백에 전구가 표시됩니다. 전구 오른쪽의 아래쪽 화살표를 클릭하고 인터페이스 구현을 선택합니다.
인터페이스의 각 메서드에서
throw new NotImplementedException();
줄을 다음으로 바꿉니다.return VSConstants.S_OK;
RDTExplorerWindow 클래스에 쿠키 필드를 추가합니다.
private uint rdtCookie;
이 필드는 AdviseRunningDocTableEvents 메서드에서 반환되는 쿠키를 포함합니다.
RDT 이벤트에 등록하려면 RDTExplorerWindow의 Initialize() 메서드를 재정의합니다. 항상 생성자가 아닌 ToolWindowPane의 Initialize() 메서드에서 서비스를 가져와야 합니다.
protected override void Initialize() { IVsRunningDocumentTable rdt = (IVsRunningDocumentTable) this.GetService(typeof(SVsRunningDocumentTable)); rdt.AdviseRunningDocTableEvents(this, out rdtCookie); }
SVsRunningDocumentTable 서비스는 IVsRunningDocumentTable 인터페이스를 가져오기 위해 호출됩니다. AdviseRunningDocTableEvents 메서드는 IVsRunningDocTableEvents를 구현하는 개체(이 경우 RDTExplorer 개체)에 RDT 이벤트를 연결합니다.
RDTExplorerWindow의 Dispose() 메서드를 업데이트합니다.
protected override void Dispose(bool disposing) { // Release the RDT cookie. IVsRunningDocumentTable rdt = (IVsRunningDocumentTable) Package.GetGlobalService(typeof(SVsRunningDocumentTable)); rdt.UnadviseRunningDocTableEvents(rdtCookie); base.Dispose(disposing); }
UnadviseRunningDocTableEvents 메서드는
RDTExplorer
와 RDT 이벤트 알림 간 연결을 삭제합니다.OnBeforeLastDocumentUnlock 처리 본문의
return
문 바로 앞에 다음 줄을 추가합니다.public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) { ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock"); return VSConstants.S_OK; }
OnAfterFirstDocumentLock 처리기의 본문 및 목록 상자에 표시할 다른 이벤트에 유사한 줄을 추가합니다.
public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) { ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock"); return VSConstants.S_OK; }
프로젝트를 빌드하고 디버깅을 시작합니다. Visual Studio 실험적 인스턴스가 표시됩니다.
RDTExplorerWindow(보기/기타 창/RDTExplorerWindow)를 엽니다.
빈 이벤트 목록이 있는 RDTExplorerWindow 창이 열립니다.
솔루션을 열거나 만듭니다.
OnBeforeLastDocument
및OnAfterFirstDocument
이벤트가 발생하면 각 이벤트에 대한 알림이 이벤트 목록에 표시됩니다.