2017-04-12 35 views
1

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 

答えて

1

VSがパッケージを読み込む必要がある場合は、Initialize()メソッドの上にある属性で指定する必要があります。

おそらく、この属性をしたい:すべての可能な負荷のリストについては

[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)] 

は訪問属性: https://www.mztools.com/articles/2013/MZ2013027.aspx

+0

これはうまくいった!私は[ProvideAutoLoad(UIContextGuids80.SolutionExists)]を使用して終了しましたが、このシナリオでは基本的に同じことです。 –

3

は、代わりに、メソッドレベルのクラスレベルでsolutionEvents宣言を移動することを忘れないでくださいまたはあなたの次の質問は、ガベージコレクションのためにしばらくの間しか動作しません。 https://msdn.microsoft.com/en-us/library/envdte.solutionevents.aspx

+0

私のsolutionEvents.Openedイベントハンドラは、明白な理由のために、青の外で、いつか働きませんでした。宣言をクラスレベルに移動した後、Carlosが示唆したように、再び動作しました:-) –

関連する問題