0

사용자 정의 프로젝트 시스템에서 작업하고 항목 이름 바꾸기에 문제가 있습니다. 프로젝트 시스템 구현은 MPF를 기반으로하고 솔루션 탐색기를 통한 항목 이름 바꾸기는 아무런 문제없이 다소 효과가 있지만 ...편집기에 문서 변경 사항을 알리는 방법

항목의 이름이 바뀌면 파일 자체에 저장된 정보도 업데이트됩니다. 코드 편집기에서 문서를 열면 편집기의 텍스트가 새로 고쳐지지 않습니다 (문서 윈도우의 캡션 만 새 파일 이름으로 바뀝니다). 열려있는 문서를 저장하면 이름 변경 작업으로 적용된 모든 변경 사항이 무시됩니다.

자동 변경 내용이 표시되도록 편집기에서 문서를 다시로드하도록하려면 어떻게해야합니까?

+0

파일을 어떻게 수정하고 있습니까? 디스크의 비트를 변경하거나 일부 편집기 API를 통해 편집 하시겠습니까? –

+0

수정할 수있는 AST 모델이 있습니다. 그래서 네, 디스크의 비트를 바꿉니다. – Matze

+0

할 일은 디스크의 비트를 편집하는 것이 아니라 VS API를 통해 텍스트를 편집하는 것입니다. 당신이 그것을 피할 수 있다면, 리로드를 강요하는 것은 좋지 않습니다. –

답변

1

사용자 지정 디자이너 대 텍스트 파일 인 경우 IVsRunningDocumentTable 인터페이스를 사용하여 현재 열려있는 파일의 텍스트 버퍼를 가져옵니다. 인터페이스의 fourth iteration은 관리되는 코드에서 사용하는 것이 가장 쉽습니다. 파일이 열려 있는지 보려면 IsMonikerValid ("모니 커"가 파일 이름 임)으로 전화를 걸면 GetDocumentData으로 전화하여 IVsTextBuffer을 가져올 수 있습니다. 이 형식 자체는 상당히 귀찮습니다. 따라서 Visual Studio 2010 이상 만 지원하는 경우 this function에 전달하여 최신 편집기 API 버전을 얻으십시오.

"이유"에 관해서는 이렇게하는 것이 좋습니다. 디스크의 파일을 편집 한 다음 강제로 다시로드하려고 시도하면 여러 가지 문제가 발생할 수 있습니다. 파일 이름을 변경하기 전에 파일을 저장하지 않으면 실수로 저장하지 않은 편집 내용을 잃을 수 있습니다. 다시로드하면 파일의 실행 취소 기록이 손실 될 수 있으며 편집기 추적 기간이나 표시가있는 파일의 추적 지점이었던 다른 확장 프로그램/기능이 추적중인 지점을 잃을 수 있습니다. 파일이 큰 파일 인 경우 성능이 약간 향상되어야합니다.

+0

'IVsRunningDocumentTable4'은 Visual Studio 2013에서만 사용할 수 있습니다. 그렇습니까? Visual Studio 2012를 원한다면'IVsRunningDocumentTable'.GetDocumentInfo'를 대신 사용해야 할 것입니다 ... – Matze

+0

그럴 경우 더 낮은 번호의 인터페이스를 사용해야합니다.주의해야 할 점이 있습니다. 덜 친숙한 방법 중 일부를 호출하십시오. IntPtrs를 다룰 때 조심해야합니다. 잘못 사용하면 메모리 누수가 발생합니다. –

+1

'IVsRunningDocumentTable'에서'FindAndLockDocument'를 사용하고'Marshal'.GetObjectForIUnknown의 결과를'IVsTextBuffer'에 안전 캐스팅하려고했습니다. 이것은 잘 작동합니다. 마지막으로, docs에서 언급 한대로 ppunkDocData를 릴리스합니다. – Matze

관련 문제