Создание окна инструментов Visual Studio - VsAddin или VsPackage - PullRequest
4 голосов
/ 05 августа 2009

Простой вопрос - я нашел два способа добавить окно инструментов в Visual Studio (2008): создать надстройку или создать пакет.

(Addin: http://www.codeproject.com/KB/dotnet/vstoolwindow.aspx)
(Пакет: http://msdn.microsoft.com/en-us/library/bb165051.aspx)

Что такое "правильный" путь?

Ответы [ 3 ]

11 голосов
/ 05 августа 2009

Вы можете сделать и то, и другое, и я. В некотором смысле надстройки немного проще, но они страдают от некоторых раздражающих недостатков.

Добавить в:

  • + Нет необходимости устанавливать Visual Studio SDK
  • + Нет необходимости использовать ключ загрузки пакета (PLK) или подписывать ваши распределенные двоичные файлы
  • + Упрощение процесса разработки при использовании API расширяемости (во многих отношениях упрощенный код)
  • + Более простой процесс установки (без дурацких проблем с реестром)
  • - Кажется, не работает так же хорошо, как панели инструментов на основе VSPackage
  • -Я столкнулся с проблемами производительности, которые побудили меня использовать COM-интерфейсы VS SDK вместо расширяемых, что привело к значительному снижению производительности. Другими словами, моя «надстройка» теперь основана на VS SDK и на самом деле является только надстройкой, потому что она загружается через файл XML вместо реестра. (Кроме того, из всего, что я могу сказать, интерфейсы Extensibility - это просто большая служебная оболочка вокруг SDK.)

VSPackages:

  • + Вы можете использовать всю мощь VS SDK, как его набор функций, так и (возможно, при тщательном использовании) преимущество в производительности
  • + Кажется, ведет себя более надежно, чем надстройки
  • - требует подписанные двоичные файлы, PLK и сложную процедуру установки
  • -Крутая кривая обучения, и многие, казалось бы, простые действия противны / запутаны. Теперь у меня есть сборка, предоставляющая методы расширения для выполнения «очевидных (для меня)» действий над интерфейсами COM. Между этим и опытом все со временем улучшилось. Существуют аналогичные варианты , доступные для сообщества , которые следует серьезно рассмотреть, если вы пойдете по этому пути.
1 голос
/ 23 мая 2013

Я думаю, что 280Z28 был совершенно правильным до VS2010. Но теперь VS2010 и VS012:

  • Не требует официально подписанных пакетов (могут быть только те, которые идут в Галерея );
  • Благодаря VSIX он может очень легко устанавливать VSPackages, которые также могут быть развернуты в Галерее.

Более того, VS2010 поддерживает другой вид расширяемости: это расширения MEF, которые представляют собой облегченные плагины, которые запускаются только при определенных событиях IDE, таких как события текстового редактора. Примером является FixMixedTabs расширение.

Просто создайте пустой пакет VSPackage (без меню, команд, ...) и скопируйте его в основной класс, чтобы создать VSPackage, который в основном загружается при наличии активного решения и просто получает ссылку на DTE2. Таким образом, вы можете просто использовать его как надстройку.

// This attribute tells the PkgDef creation utility (CreatePkgDef.exe) that this class is
// a package.
[PackageRegistration(UseManagedResourcesOnly = true)]
// This attribute is used to register the informations needed to show the this package
// in the Help/About dialog of Visual Studio.
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[Guid(GuidList.guidVSPackage1PkgString)]
// Load this package when a solution is loaded (VSConstants.UICONTEXT_SolutionExists)
[ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")]
public sealed class VSPackage1Package : Package
{
    /// <summary>
    /// Default constructor of the package.
    /// Inside this method you can place any initialization code that does not require 
    /// any Visual Studio service because at this point the package object is created but 
    /// not sited yet inside Visual Studio environment. The place to do all the other 
    /// initialization is the Initialize method.
    /// </summary>
    public VSPackage1Package()
    {
        Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString()));
    }

    /// <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 initilaization code that rely on services provided by VisualStudio.
    /// </summary>
    protected override void Initialize()
    {
        Trace.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));
        base.Initialize();

        IVsExtensibility extensibility =
            GetService(typeof(EnvDTE.IVsExtensibility)) as
            IVsExtensibility;
        DTE2 dte = extensibility.GetGlobalsObject(null).DTE as DTE2;
    }
}
0 голосов
/ 05 августа 2009

Если вы просто создаете простое окно инструментов, я предлагаю перейти по маршруту надстройки.

Пакеты и надстройки - это способы расширения Visual Studio. Вообще говоря, они имеют одинаковую функциональность. Пакеты немного мощнее и позволяют глубже интегрироваться в Visual Studio. Но эта более глубокая интеграция сопряжена с определенными затратами, включая увеличение времени разгона и процедуры установки.

Надстройки разработаны для более легкого механизма расширения. Меньшее время нарастания и более простая установка.

Если все, что вы делаете, это окно инструментов с базовым взаимодействием редактора с нашей моделью кода, тогда надстройка - лучший путь.

...