public int GetTextViewFilter(IVsIntellisenseHost pISenseHost, IOleCommandTarget pNextCmdTarget, out IVsTextViewFilter pTextViewFilter) { pTextViewFilter = null; IVsTextLines buffer; ErrorHandler.ThrowOnFailure(bufferCoordinator.GetSecondaryBuffer(out buffer)); var secondaryFilePath = FilePathUtilities.GetFilePath(buffer); if (secondaryFilePath == null) secondaryFilePath = NemerleSource.GetStubFileForSecondaryBuffer(buffer); var secondaryFileIndex = Location.GetFileIndex(secondaryFilePath); var primaryFileindex = Location.GetFileIndex(_filePath); bool doOutlining = LanguageService.Preferences.AutoOutlining; LanguageService.Preferences.AutoOutlining = false; if (_projectInfo != null && LanguageService.GetSource(buffer) == null) { // создаем и регистрируем в проекте временный source, чтобы не сломалась логика // конструктора NemerleSource (см вызов LanguageService.AddEditableSource) //_projectInfo.ReplaseOrAddSource(new FileNemerleSource(secondaryFileIndex)); _projectInfo.AddEditableSource((NemerleSource)LanguageService.CreateSource(buffer)); } NemerleSource source = LanguageService.GetOrCreateSource(buffer) as NemerleSource; source.SetBufferCoordinator(bufferCoordinator); if (_projectInfo != null) { _projectInfo.Engine.RequestOnBuildTypesTree(); } LanguageService.Preferences.AutoOutlining = doOutlining; _windowManager = LanguageService.CreateCodeWindowManager(null, source); language.AddCodeWindowManager(_windowManager); // увеличиваем внутренний счетчик openCount, для того чтобы впоследствии корректно отработала логика закрытия соурса source.Open(); TextViewWrapper view = new TextViewWrapper(languageHost, pISenseHost, bufferCoordinator, pNextCmdTarget, source); _windowManager.OnNewView(view); pTextViewFilter = view.InstalledFilter; NemerleViewFilter nemerleFilter = pTextViewFilter as NemerleViewFilter; if (null != nemerleFilter) nemerleFilter.BufferCoordinator = this.bufferCoordinator; // сохраним значение DocumentEvents в переменной класса, чтобы исключить преждевременное уничтожение // объекта и автоматическоей отписывание от событий. // // Источник решения: // PRB: Visual Studio .NET events being disconnected from add-in (http://www.mztools.com/articles/2005/mz2005012.aspx) _documentEvents = _projectItem.DTE.Events.get_DocumentEvents(_projectItem.Document); _documentEvents.DocumentClosing += _documentClosingEventHandler; return VSConstants.S_OK; }