Расширение Visual Studio: как получить строку, в которой было вызвано контекстное меню?

Я хотел бы создать расширение VS, в котором мне нужно знать номер строки, в которой было вызвано меню. Я нашел реализацию VisualBasic с макросом, который кажется сделать это, но я не знаю, как это сделать на C#. Цель состоит в том, чтобы узнать точный номер строки, на которой был вызван ContextMenu, чтобы поместить на нее значок-заполнитель, как точку останова. Полезные ссылки приветствуются, так как я не смог найти много по этой теме.


person rTECH    schedule 01.09.2017    source источник
comment
См. stackoverflow.com/questions/32502847/   -  person Sergey Vlasov    schedule 02.09.2017
comment
Можете ли вы привести пример того, как это использовать? Первая строка примера, предоставленного по ссылке, EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection; выдает ошибку: Для нестатического поля, метода или свойства '_DTE.ActiveWindow' требуется ссылка на объект.   -  person rTECH    schedule 02.09.2017
comment
Чтобы получить объект DTE, см. stackoverflow.com/questions/19087186/   -  person Sergey Vlasov    schedule 03.09.2017
comment
Я создал образец на основе предложения Сергея Власова, и он может вернуть номер строки, на которой находится курсор в редакторе кода. Вам просто нужно получить значение DTE с помощью DTE dte = (DTE)this.ServiceProvider.GetService(typeof(DTE)); в проекте VSIX и замените DTE.ActiveWindow на dte.ActiveWindow. Если у вас есть какие-либо вопросы, пожалуйста, дайте нам знать.   -  person Weiwei    schedule 04.09.2017
comment
Спасибо вам обоим, все работает отлично. Если кто-то из вас преобразует комментарии в правильный ответ, чтобы другим было легче его найти, я с радостью отмечу его как ответ / голосование!   -  person rTECH    schedule 05.09.2017


Ответы (1)


Вы можете создать проект VSIX и добавить в него элемент Command. Затем добавьте следующий код в метод 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);
    }
person Weiwei    schedule 06.09.2017