0

私は、メニューが呼び出された行番号を知る必要があるVS拡張を作成したいと考えています。私はと思われるマクロでVisualBasic implementationを見つけましたが、C#でこれをどのように開始するのか分かりません。目標は、ちょうどブレークポイントのようにプレースホルダーアイコンを置くために呼び出されたContextMenuの行の正確な数を知ることです。有用なリンクは、私がこのトピックについて多くを見つけることができなかったので高く評価されています。Visual Studio Extension:コンテキストメニューが呼び出された行を取得するには?

+0

はhttps://stackoverflow.com/questions/32502847/is-there-any-extension-for-vs-copying-code-position –

+0

あなたがこれを使用する方法についての例を提供することができますか? EnvDTE.TextSelection ts = DTE.ActiveWindow.SelectionとしてEnvDTE.TextSelectionとして実際に提供されているこの例の最初の行は、エラーが表示されます: \t _静的でないフィールドのメソッドにはオブジェクト参照が必要です、またはプロパティ '_DTE.ActiveWindow' _。 – rTECH

+0

DTEオブジェクトを取得する方法については、https://stackoverflow.com/questions/19087186/how-to-acquire-dte-object-instance-in-a-vs-package-project –

答えて

2

VSIXプロジェクトを作成し、プロジェクトにコマンド項目を追加することができます。その後、次のコードをMenuItemCallback()メソッドに追加して、コード行番号を取得します。

private void MenuItemCallback(object sender, EventArgs e) 
    { 
     EnvDTE.DTE dte = (EnvDTE.DTE)this.ServiceProvider.GetService(typeof(EnvDTE.DTE)); 

     EnvDTE.TextSelection ts = dte.ActiveWindow.Selection as EnvDTE.TextSelection; 
     if (ts == null) 
      return; 
     EnvDTE.CodeFunction func = ts.ActivePoint.CodeElement[vsCMElement.vsCMElementFunction] 
        as EnvDTE.CodeFunction; 
     if (func == null) 
      return; 

     string message = dte.ActiveWindow.Document.FullName + System.Environment.NewLine + 
      "Line " + ts.CurrentLine + System.Environment.NewLine + 
      func.FullName; 

     string title = "GetLineNo"; 

     VsShellUtilities.ShowMessageBox(
      this.ServiceProvider, 
      message, 
      title, 
      OLEMSGICON.OLEMSGICON_INFO, 
      OLEMSGBUTTON.OLEMSGBUTTON_OK, 
      OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST); 
    } 
関連する問題