Что такое ADD-IN? ADD-IN – это надстройка, которую можно создать самим в среде Visual Studio и которая может расширить функционал, который по умолчанию отсутствует в программе. В конкретно нашем случае я буду делать простенькую надстройку в SQL Server Management Studio 2008.
В качестве среды разработки использую Microsoft Visual Studio 2008. Запускаем Visual Studio 2008 и создаём новый проект: File->New->Project…->Other Project Types->Extensibility->Visual Studio Add-In.


Далее выбираем язык для разработки (Шаг 1):

На 2ом Шаге выбираем приложение, для которого создаётся надстройка:

3 Шаг: Указываем название нашей надстройки и её описание

На 4ом Шаге указываем параметры надстроек:
- Будет ли надстройка выводится в меню Сервис.
- Задайте условия запуска надстройки.
- Будет ли надстройка использовать модальный пользовательский интерфейс или нет.
Во втором случае ее можно будет безопасно использовать при построении через командную строку.

Шаг 5 - “Справка, О программе” задайте, должна ли надстройка отображаться в окне Visual Studio “Help About”.

После выполнения шагов 1-6 выбранные параметры отображаются для просмотра на странице Сводка.
Если все верно, нажмите Готово, чтобы создать надстройку. Если необходимо что-либо изменить, нажмите кнопку Назад.

Заготовка нашей надстройки готова, осталось добавить несколько моментов.
Во-первых: добавим в наш проект Setup Project, для более удобной инсталляции нашей надстройки.
File->Add->New Project…->Other Project Types->Setup and Deployment->Setup Project 
Добавим в реестр ключ для активизации нашей надстройки при запуске SSMS (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\Shell\Addins\)


Кроме этого необходимо в наш проект добавить Assemblies для SSMS, которые расположены в папках с установленными компонентами SQL Server 2008: C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\ (Microsoft.SqlServer.ConnectionInfo.dll и Microsoft.SqlServer.RegSvrEnum.dll) и C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\ (Microsoft.SqlServer.SqlTools.VSIntegration.dll и SqlWorkbench.Interfaces.dll)


А в наш Setup Project добавим Project Output…:


При этом возможно «вылетит» предупреждение:

Чтобы в дальнейшем у нас не было с этим проблем и для того, чтобы «облегчить» нашу надстройку, отключим все объекты из Setup Project->Detected Dependencies

А в свойствах Primary output значение Register меняем на vsdrpCom:

Теперь добавим несколько строк в наш класс Connect.cs:
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer;
using Microsoft.SqlServer.Management.UI.VSIntegration;
using System.Text.RegularExpressions;
namespace MySSMSAddin
{
public class Connect : IDTExtensibility2
{
private AddIn _addInInstance;
private HierarchyObject _tableMenu = null;
//меню нашей надстройки будет на уровне сервера
private Regex _tableRegex = new Regex(@"^Server\[[^\]]*\]$");
//значение для меню уровня БД: @"^Server\[[^\]]*\]/Database\[[^\]]*\]$"
//или, например, уровня таблицы: @"^Server\[[^\]]*\]/Database\[[^\]]*\]/Table\[[^\]]*\]$"
public Connect()
{
}
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_addInInstance = (AddIn)addInInst;
IObjectExplorerService objectExplorer = ServiceCache.GetObjectExplorer();
IObjectExplorerEventProvider provider = (IObjectExplorerEventProvider)objectExplorer.GetService(typeof(IObjectExplorerEventProvider));
provider.SelectionChanged += new NodesChangedEventHandler(Provider_SelectionChanged);
}
private void Provider_SelectionChanged(object sender, NodesChangedEventArgs args)
{
INodeInformation[] nodes;
int nodeCount;
IObjectExplorerService objectExplorer = ServiceCache.GetObjectExplorer();
objectExplorer.GetSelectedNodes(out nodeCount, out nodes);
INodeInformation node = (nodeCount > 0 ? nodes[0] : null);
if (_tableMenu == null &&
_tableRegex.IsMatch(node.Context))
{
_tableMenu = (HierarchyObject)node.GetService(typeof(IMenuHandler));
MenuItem item = new MenuItem();
_tableMenu.AddChild(string.Empty, item);
}
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
{
}
public void OnAddInsUpdate(ref Array custom)
{
}
public void OnStartupComplete(ref Array custom)
{
}
public void OnBeginShutdown(ref Array custom)
{
}
}
}
И создадим новый класс MenuItem.cs(меню нашей надстройки):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer;
namespace MySSMSAddin
{
public class MenuItem : ToolsMenuItemBase, IWinformsMenuHandler
{
public MenuItem()
{
//Создаём меню "MyTestAddIn"
this.Text = "MyTestAddIn";
}
protected override void Invoke()
{
}
public override object Clone()
{
return new MenuItem();
}
#region IWinformsMenuHandler Members
public System.Windows.Forms.ToolStripItem[] GetMenuItems()
{
ToolStripMenuItem item = new ToolStripMenuItem("MyTestAddIn");
//Подменю будет с названием "ConnectionString"
ToolStripMenuItem ConnectionString = new ToolStripMenuItem("ConnectionString");
ConnectionString.Tag = false;
ConnectionString.Click += new EventHandler(ConnectionStringItem_Click);
item.DropDownItems.Add(ConnectionString);
return new ToolStripItem[] { item };
}
#endregion
void ConnectionStringItem_Click(object sender, EventArgs e)
{
//Выводим строку коннекции к выбранному серверу БД
MessageBox.Show(this.Parent.Connection.ConnectionString,
"ConnectionString",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}
В References добавим два компонента .Net: System.Windows.Forms и System.Drawing
Вот теперь точно ВСЁ!!!
Компилируем наш проект и запускаем установщик:


Далее выбираем куда установить нашу надстроечку и кому она будет доступна на данном компьютере (всем или только вам):

Теперь запускаем SQL Server Management Studio, если вы всё сделали верно, указали и зарегистрировали все сборки, то у вас не будит никаких ошибок, иначе, при запуске SSMS, на экране получите ошибку ( Error Message: Class not registered Error number: 80040154 ):

А при удачной установке в основном меню появилось меню нашей сборки:

Результат работы, которого – это вывод на экран строки подключения для текущего сервера БД:

Таким образом, мы за 10 минут реализовали простейший ADD-IN для SSMS. Удалить настройку можно, как любой другой компонент/программу, установленные на вашем компьютере:

Скачать исходный код данного проекта - MySSMSAddin.rar
Ссылки по данной теме: