Visual Studio VSIX OnSolutionOpened无法正常工作

问题描述:

我试图为Visual Studio实现某种起始页扩展。主要目的是通过在每次打开解决方案时启动本地HTML文件来为我工作的公司内的特定项目提供说明和最佳实践。我开始使用完美工作的Visual Commander(https://vlasovstudio.com/visual-commander/extensions.html)。但我想把它变成一个VSIX文件。经过一番研究,我生成了代码,但如果我调试或直接从调试文件夹安装vsix,则不会发生任何事情(即使我在第一行中抛出异常)。代码非常简单:Visual Studio VSIX OnSolutionOpened无法正常工作

#region Package Members 

    DTE DTE; 

    /// <summary> 
    /// Initialization of the package; this method is called right after the package is sited, so this is the place 
    /// where you can put all the initialization code that rely on services provided by VisualStudio. 
    /// </summary> 
    protected override void Initialize() 
    { 
     base.Initialize(); 
     try 
     { 
      IServiceContainer serviceContainer = this as IServiceContainer; 
      DTE = serviceContainer.GetService(typeof(SDTE)) as DTE; 
      EnvDTE.Events events = DTE.Events; 
      EnvDTE.SolutionEvents solutionEvents = events.SolutionEvents; 
      solutionEvents.Opened += OnSolutionOpened; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    private void OnSolutionOpened() 
    { 
     try 
     { 
      string startupFile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(DTE.Solution.FullName), GetSolutionStartPage()); 
      if (System.IO.File.Exists(startupFile)) 
      { 
       DTE.ItemOperations.Navigate(startupFile); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    string GetSolutionStartPage() 
    { 
     return ((DTE.Solution != null) ? System.IO.Path.GetFileNameWithoutExtension(DTE.Solution.FullName) : "") + ".html"; 
    } 

    #endregion 

当VS应该加载你的包时,你需要用Initialize()方法上面的属性指定。

您可能希望此属性:

[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)] 

对于所有可能的负载属性的列表,请访问: https://www.mztools.com/articles/2013/MZ2013027.aspx

+0

是的,这工作!我最终使用了[ProvideAutoLoad(UIContextGuids80.SolutionExists)],但本质上这种情况基本相同。 –

不要忘了在类级别而不是方法级别移动solutionEvents声明,或者你的下一个问题将是只有一段时间(因为垃圾回收)。见https://msdn.microsoft.com/en-us/library/envdte.solutionevents.aspx

+0

我的solutionEvents.Opened事件处理程序在一天之内停止工作,出于无缘无故的理由。按照卡洛斯的建议,将宣言移至课堂级别后,再次运作:-) –