0

Je voudrais créer une extension VS dans laquelle j'ai besoin de connaître le numéro de ligne sur lequel le menu a été appelé. J'ai trouvé un VisualBasic implementation avec une macro que semble pour ce faire, mais je ne sais pas comment démarrer en C#. Le but serait de connaître le numéro exact de la ligne sur laquelle le ContextMenu a été appelé pour placer une icône d'espace réservé comme un point de rupture. Les liens utiles sont appréciés car je n'ai pas trouvé grand chose sur ce sujet.Visual Studio Extension: Comment obtenir la ligne sur laquelle le menu contextuel a été appelé?

+0

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

+0

Pouvez-vous donner un exemple sur la façon d'utiliser? La première ligne de l'exemple réellement fourni via le lien 'EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection comme EnvDTE.TextSelection;' me donne l'erreur: \t _Une référence d'objet est requise pour le champ non statique, méthode ou propriété '_DTE.ActiveWindow'_. – rTECH

+0

Pour obtenir l'objet DTE, voir https://stackoverflow.com/questions/19087186/how-to-acquire-dte-object-instance-in-a-vs-package-project –

Répondre

2

Vous pouvez créer un projet VSIX et ajouter un élément de commande dans votre projet. Puis ajoutez le code suivant dans la méthode MenuItemCallback() pour obtenir le numéro de ligne de code.

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); 
    }