sticky
FAQ - Расширение Visual Studio

Все ответы

  • 1.1 Как я могу вывести какой-либо текст в строке статуса в Visual Studio?

     

    В VSPackage вы можете вывести нужный текст в строке статуса, используя сервис SVsStatusbar

    Пример:

    IVsStatusbar statusBar = (IVsStatusbar)GetService(typeof(SVsStatusbar));
    int frozen;
     
    statusBar.IsFrozen(out frozen);
     
    if (frozen == 0)
    {
      // Установить текст в статус баре и зафиксировать его отображение. 
      statusBar.SetText("Here is a text on status bar.");
      statusBar.FreezeOutput(1);
     
      // Получить текст статус бара 
      string text;
      statusBar.GetText(out text);
      System.Windows.Forms.MessageBox.Show(text);
     
      // Очистить статус бар 
      statusBar.FreezeOutput(0);
      statusBar.SetText("");
    }
    
    


    Для связи [mail]
    22 декабря 2010 г. 15:11
  • 1.2 Как можно получить текущий выбранный элемент проекта?

     

    Вы можете использовать сервис SVsShellMonitorSelection для получения текущего выбранного IVsHierarchy, и затем получить элемент проекта, используя метод GetProjectItem().

    Пример:

    IntPtr hierarchyPtr, selectionContainerPtr;
    Object prjItemObject = null;
    IVsMultiItemSelect mis;
    uint prjItemId;
    IVsMonitorSelection monitorSelection = (IVsMonitorSelection)Package.GetGlobalService(typeof(SVsShellMonitorSelection));
    monitorSelection.GetCurrentSelection(out hierarchyPtr, out prjItemId, out mis, out selectionContainerPtr);
    IVsHierarchy selectedHierarchy = Marshal.GetTypedObjectForIUnknown(hierarchyPtr, typeof(IVsHierarchy)) asIVsHierarchy;
    if (selectedHierarchy != null)
    {
    ErrorHandler.ThrowOnFailure(selectedHierarchy.GetProperty(prjItemId, (int)__VSHPROPID.VSHPROPID_ExtObject, out prjItemObject));
    }
    ProjectItem selectedPrjItem = prjItemObject asProjectItem;
    
    


    Для связи [mail]
    22 декабря 2010 г. 15:13
  • 1.3 Как я могу получить DTE объект в VSPackage?

     

    DTE выступает как глобальный сервис в Visual Studio. Ниже приведены примеры, как можно получить DTE объект в VSPackage:

    1.	EnvDTE.DTE dte = (EnvDTE.DTE)GetService(typeof(EnvDTE.DTE));
    
    2.	EnvDTE.IVsExtensibility extensibility = GetService(typeof(EnvDTE.IVsExtensibility)) as EnvDTE.IVsExtensibility;
        EnvDTE.DTE dte = extensibility.GetGlobalsObject(null).DTE as EnvDTE.DTE;
    
    3.	EnvDTE.DTE dte = System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0") as EnvDTE.DTE;
    
    

     

    Обратите внимание, что GetService(typeof(EnvDTE.DTE)) может возвращать null, если Visual Studio не была полностью загружена и инициализирована. Это состояние среды называется “zombie” состояние. С помощью свойства VSPROPID_Zombie можно узнать находится ли среда разработки в “zombie” состоянии или нет.

    Чтобы обойти эту проблему вам нужно просто отложить выполнение вашего кода в Initialize методе до того момента, пока свойство VSPROPID_Zombie не станет false. Для этого ваше package должен реализовывать интерфейс IVsShellPropertyChanges, и выполнить ваш код инициализации дополнения в IVsShellPropertyChanges.OnShellPropertyChange. Ниже приведен пример:

    public class MyPackage : Package, IVsShellPropertyEvents
    {
      DTE dte;
      uint cookie;
     
      protected override void Initialize()
      {
       base.Initialize();
     
       // set an eventlistener for shell property changes 
       IVsShell shellService = GetService(typeof(SVsShell)) as IVsShell;
       if (shellService != null)
         ErrorHandler.ThrowOnFailure(shellService.AdviseShellPropertyChanges(this,out cookie));
     
       // code not depending on zombie state 
       ……..
      }
     
      public int OnShellPropertyChange(int propid, object var)
      {
       // when zombie state changes to false, finish package initialization
       if ((int)__VSSPROPID.VSSPROPID_Zombie == propid)
       {
         if ((bool)var == false)
         {
          // zombie state dependent code
          this.dte = GetService(typeof(SDTE)) as DTE;
     
          // eventlistener no longer needed
          IVsShell shellService = GetService(typeof(SVsShell)) as IVsShell;
          if (shellService != null)
            ErrorHandler.ThrowOnFailure(shellService.UnadviseShellPropertyChanges(this.cookie) );
          this.cookie = 0;
         }
       }
       return VSConstants.S_OK;
      }
    }
    
    


    Для связи [mail]
    22 декабря 2010 г. 15:18
  • 1.4 Как сделать автоматическую загрузку моего VSPackage?

     

    Атрибут ProvideAutoLoad предназначен для этого. Вы можете использовать его в вашем дополнении для различных сценариев автозагрузки дополнения.

    [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids80.SolutionExists)]
    publicsealedclassVSPackage1Package : Package
    

     

    Различные варианты UIContextGuids смотрите здесь

     


    Для связи [mail]
    22 декабря 2010 г. 15:20
  • 1.5 Как я могу установить размер Tool Windows в рантайме?

     

    Основная идея реализации этого заключается в том, чтобы получить IVsWindowFrame интерфейс и вызвать метод SetFramePos(). Получение интерфейса IVsWindowFrame немного сложнее. Вы должны привести SVsWindowFrame к IServiceProvider, для того, чтобы потом вызвать метод IVsWindowPane.SetSite() Tool окна. Если вы используете MPF toolwindow, вы можете использовать свойство ToolWindowPane.Frame, но только после того, как был вызван OnToolWindowCreated() (чтобы удостовериться, что Tool Window был создан).

    Пример:

    Guid nullGuid = Guid.Empty;
    ToolWindowPane window = this.FindToolWindow(typeof(YourToolWindowClass), 0, true);
    if ((null == window) || (null == window.Frame))
    {
      thrownewNotSupportedException(Resources.CanNotCreateWindow);
    }
    IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
    Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());
    windowFrame.SetFramePos(VSSETFRAMEPOS.SFP_fSize, ref nullGuid, 5, 5, 305, 305);
    
    

    Только учтите, что вызов метода SetFramePos() должен исполнятся после вызова метода Show().


    Для связи [mail]
    22 декабря 2010 г. 15:23
  • 1.6 Как я могу изменить существующую языковую службу?

     

    Вам необходимо установить атрибут для Package [ProvideEditorExtension (TypeOf (...), ". JS", 100)], который определяет приоритет 100 или выше, тогда IDE будет загружать вашу языковую службу, при открытии редактора. Если вы хотите использовать DTE.OpenFile() метод для открытия файла языковой службы, то, пожалуйста, при вызове метода, в качестве первого параметра передавайте Constants.vsViewKindPrimary.


    Для связи [mail]
    22 декабря 2010 г. 15:24
  • 2.1 Как можно вывести информацию об ошибке не в Output окно, а в Error List?

     

    Вы можете использовать метод OutputWindowPane.OutputTaskItemString(), который пишет не только в Output окно, но и в ErrorList тоже.

    OutputWindowPane buildPane = _applicationObject.ToolWindows.OutputWindow.OutputWindowPanes.Item("Build");
    buildPane.Activate();
    buildPane.OutputTaskItemString("stdafx.h(1) : a", vsTaskPriority.vsTaskPriorityHigh, null, vsTaskIcon.vsTaskIconComment, "stdafx.h", 1, "a", true);
    
    


    Для связи [mail]
    22 декабря 2010 г. 15:25
  • 2.2 Как подписаться на событие команды Visual Studio?

     

    С помощью DTE Automation, вы можете использовать DTE.Events для получения события конкретной команды, зная GUID и ID команды. После создать обработчики для событий CommandEvents.BeforeExecute или CommandEvents.AfterExecute.

    Более подробно об этом написано в блоге Dr. eX - Using EnableVSIPLogging to identify menus and commands with VS 2005 + SP1

     


    Для связи [mail]
    22 декабря 2010 г. 15:27
  • 2.3 Как получить информацию AdditionalIncludeDirectories в VC++ проекте?

     

    Используя DTE Automation, вы можете получить этот тип информации с помощью интерфейсов VCConfiguration и VCCLCompilerTool interfaces.

    Пример:

    foreach (Projectproj in _applicationObject.Solution.Projects)
    {
      VCProject vcp = proj.Object asVCProject;
      IVCCollection ivcc = vcp.Configurations asIVCCollection;
      VCConfiguration cfg = ivcc.Item(1) asVCConfiguration;
      IVCCollection tools = cfg.Tools asIVCCollection;
      VCCLCompilerTool compiler = tools.Item("VCCLCompilerTool") asVCCLCompilerTool;
      string addDir = compiler.AdditionalIncludeDirectories;
      MessageBox.Show(addDir);
    }
    



    Для связи [mail]
    22 декабря 2010 г. 15:29
  • 2.4 Как получить конкретную конфигурацию из Configuration Manager?

     

    Есть два типа конфигураций в Visual Studio: конфигурация решения (solution configuration) и конфигурация проект (project configuration)

    • Для конфигурации решения вы можете использовать интерфейс SolutionConfigurations из DTE Automation.
    • Для конфигурации проекта вы можете использовать интерфейс ConfigurationManager из DTE Automation.

    Код ниже демонстрирует, как переименовать конфигурацию в менеджере конфигурации. Т.к. свойство Name доступно только для чтения, то необходимо создать новую конфигурации на основе старой, а затем старую удалить.

    try
    {
    // изменяем имя конфигурации решения
    Solution2 sol = _applicationObject.Solution asSolution2;
    SolutionConfigurations sc = sol.SolutionBuild.SolutionConfigurations;
    if (sc.Item("Debug") != null)
      {
        sc.Add("DebugStatic", "Debug", true);
        sc.Item("Debug").Delete();
      }
    // изменяем имя конфигурации проекта
    ConfigurationManager cm = sol.Projects.Item(1).ConfigurationManager;
    if (cm.ConfigurationRow("Debug") != null)
      {
        cm.AddConfigurationRow("DebugStatic", "Debug", true);
        cm.DeleteConfigurationRow("Debug");
      }
    }
    catch (Exception e)
    {
      System.Windows.Forms.MessageBox.Show(e.Message);
    }
    
    


    Для связи [mail]
    22 декабря 2010 г. 15:33
  • 2.5 Как можно показать меню команд дополнения только для режима Debug?

     

    Для того, чтобы добиться этого, вы можете указывать статус команды с помощью vsCommandStatus перечисления и использовать свойство DTE.Mode для проверки текущего режима. Ниже пример:

    public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)
    {
    if (neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
      {
    if (commandName == "AddinSample.Connect.AddinSample"&&
     _applicationObject.Mode == vsIDEMode.vsIDEModeDebug)
        {
          status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported |
    vsCommandStatus.vsCommandStatusEnabled;
    return;
        }
      }
    }
    
    


    Для связи [mail]
    22 декабря 2010 г. 15:34
  • 3.1 Как установить Build Action в шаблоне элемента?

     

    Вы можете изменить свойства элемента проекта в узле “ ProjectItem” установив опцию ReplaceParameters в true. И для изменения Build Action используйте свойство ItemType:

    < ProjectItem SubType = ""

    TargetFileName = "$fileinputname$.YYY "

    ReplaceParameters = "true "

    ItemType = "Embedded Resource "

    CustomTool = "ARWrapperGenerator ">

    MyFile.YYY

    </ ProjectItem >

     


    Для связи [mail]
    22 декабря 2010 г. 15:37
  • 4.1 Как использовать уже существующий дизайнер?

     

    Вы можете повторно использовать WinForm и WorkFlow дизайнеры в вашем приложении с помощью DesignSurface, но остальные дизайнеры существенно отличаются от WinForm и WorkFlow дизайнеров.

    WinForm и WorkFlow дизайнеры фактически включены в .NET Framework. Однако, WebForm и xaml дизайнеры реализованы, как Visual Studio дополнения и они зависят от многих сервисов, которые Visual Studio предоставляет. Эти дизайнеры могут быть размещены только в среде разработки Visual Studio. Они также могут распространяться/поддерживаться в изолированной среде. Но они не могут быть использованы в других автономных приложения.

     


    Для связи [mail]
    22 декабря 2010 г. 15:39
  • 5.1 Как диагностировать ошибки загрузки дополнений?

     

    Это подробно расписано в блоге Dr. eX - Debugging Package Load Failures (англ)

     


    Для связи [mail]
    22 декабря 2010 г. 15:41
  • Здравствуй. Может подскажешь что делать http://social.msdn.microsoft.com/Forums/ru-RU/vsru/thread/9c8d9e2d-e9f6-4f11-b686-25d7d0e48653

    2 сентября 2011 г. 13:59