C# 如何根据IWPTextViewCreationListener-VsTextViewCreated中的条件关闭IWPTextView

C# 如何根据IWPTextViewCreationListener-VsTextViewCreated中的条件关闭IWPTextView,c#,visual-studio,vs-extensibility,C#,Visual Studio,Vs Extensibility,我有一个听IWPTextViewCreationListener的类 using System.ComponentModel.Composition; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Editor; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.

我有一个听IWPTextViewCreationListener的类

using System.ComponentModel.Composition;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Editor;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.TextManager.Interop;
using Microsoft.VisualStudio.Utilities;
using Microsoft.VisualStudio.OLE.Interop;

namespace GoToSequence
{
    [Export(typeof(IVsTextViewCreationListener))]
    [ContentType("Code")]
    [TextViewRole(PredefinedTextViewRoles.Editable)]
    internal class GoToSequenceEditorCreationListener : IVsTextViewCreationListener
    {
        [Import(typeof(IVsEditorAdaptersFactoryService))]
        internal IVsEditorAdaptersFactoryService editorFactory = null;

        public void VsTextViewCreated(IVsTextView textViewAdapter)
        {
            IWpfTextView textView = editorFactory.GetWpfTextView(textViewAdapter);
            if (textView == null)
                return;

            AddCommandFilter(textViewAdapter, new GoToSequenceCommandHandler(textView, textViewAdapter));
        }

        void AddCommandFilter(IVsTextView viewAdapter, GoToSequenceCommandHandler commandFilter)
        {
            if (commandFilter.m_added == false)
            {
                //get the view adapter from the editor factory
                IOleCommandTarget next;
                int hr = viewAdapter.AddCommandFilter(commandFilter, out next);

                if (hr == VSConstants.S_OK)
                {
                    commandFilter.m_added = true;
                    //you'll need the next target for Exec and QueryStatus 
                    if (next != null)
                        commandFilter.m_nextTarget = next;
                }
            }
        }
    }
}
在函数-VsTextViewCreated中,根据特定条件,我想关闭textview

If (condition == null)
   IWpfTextView.Close()
然而,在这样做之后,我得到了以下错误

System.ObjectDisposedException未处理消息:未处理 中发生“System.ObjectDisposedException”类型的异常 Microsoft.VisualStudio.Platform.VSEditor.dll其他信息: 无法访问已释放的对象

我也试过了

if(condition == null)
  IVsTextView.CloseView()

但这也无济于事。以编程方式关闭文本视图的正确方法是什么?

好的。。。我能够解决上述问题

var dte2 = (EnvDTE80.DTE2)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.Shell.Interop.SDTE));
Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte2;
Microsoft.VisualStudio.Shell.ServiceProvider serviceProvider = new Microsoft.VisualStudio.Shell.ServiceProvider(sp);

Microsoft.VisualStudio.Shell.Interop.IVsUIHierarchy uiHierarchy;
uint itemID;
Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame windowFrame;
Microsoft.VisualStudio.Shell.VsShellUtilities.IsDocumentOpen(serviceProvider, _iTextDocument.FilePath, Guid.Empty, out uiHierarchy, out itemID, out windowFrame);

windowFrame.CloseFrame((uint)__FRAMECLOSE.FRAMECLOSE_NoSave);
但是,我仍然想知道为什么IWPTextView.Close()或IVSTextView.CloseView()不能工作