Свой ADD-IN для SSMS (SQL Server Management Studio) за 10 минутИсточник: t-sql
Что такое ADD-IN? ADD-IN - это надстройка, которую можно создать самим в среде Visual Studio и которая может расширить функционал, который по умолчанию отсутствует в программе. Запускаем 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\ ) А в наш Setup Project добавим Project Output…: При этом возможно "вылетит" предупреждение: Чтобы в дальнейшем у нас не было с этим проблем и для того, чтобы "облегчить" нашу надстройку, отключим все объекты из Setup Project->Detected Dependencies А в свойствах Primary output значение Register меняем на vsdrpCom: 01. using System; 02. using Extensibility; 03. using EnvDTE; 04. using EnvDTE80; 05. using Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer; 06. using Microsoft.SqlServer.Management.UI.VSIntegration; 07. using System.Text.RegularExpressions; 08. 09. namespace MySSMSAddin 10. 11. { 12. public class Connect : IDTExtensibility2 13. 14. { 15. private AddIn _addInInstance; 16. private HierarchyObject _tableMenu = null ; 17. 18. //меню нашей надстройки будет на уровне сервера 19. private Regex _tableRegex = new Regex(@"^Server\[[^\]]*\]$"); 20. 21. //значение для меню уровня БД: @"^Server\[[^\]]*\]/Database\[[^\]]*\]$" 22. //или, например, уровня таблицы: @"^Server\[[^\]]*\]/Database\[[^\]]*\]/Table\[[^\]]*\]$" 23. 24. public Connect() 25. { 26. 27. } 28. 29. public void OnConnection( object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) 30. { 31. _addInInstance = (AddIn)addInInst; 32. IObjectExplorerService objectExplorer = ServiceCache.GetObjectExplorer(); 33. IObjectExplorerEventProvider provider = (IObjectExplorerEventProvider)objectExplorer.GetService( typeof (IObjectExplorerEventProvider)); 34. provider.SelectionChanged += new NodesChangedEventHandler(Provider_SelectionChanged); 35. } 36. private void Provider_SelectionChanged( object sender, NodesChangedEventArgs args) 37. { 38. INodeInformation[] nodes; 39. int nodeCount; 40. IObjectExplorerService objectExplorer = ServiceCache.GetObjectExplorer(); 41. objectExplorer.GetSelectedNodes( out nodeCount, out nodes); 42. INodeInformation node = (nodeCount > 0 ? nodes[0] : null ); 43. 44. if (_tableMenu == null && 45. _tableRegex.IsMatch(node.Context)) 46. { 47. _tableMenu = (HierarchyObject)node.GetService( typeof (IMenuHandler)); 48. MenuItem item = new MenuItem(); 49. _tableMenu.AddChild( string .Empty, item); 50. } 51. } 52. public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) 53. { 54. } 55. 56. public void OnAddInsUpdate( ref Array custom) 57. { 58. 59. } 60. 61. public void OnStartupComplete( ref Array custom) 62. { 63. 64. } 65. 66. public void OnBeginShutdown( ref Array custom) 67. { 68. 69. } 70. 71. } 72. 73. } 01. using System; 02. using System.Collections.Generic; 03. using System.Linq; 04. using System.Text; 05. using System.Windows.Forms; 06. using Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer; 07. 08. namespace MySSMSAddin 09. { 10. public class MenuItem : ToolsMenuItemBase, IWinformsMenuHandler 11. { 12. public MenuItem() 13. { 14. //Создаём меню "MyTestAddIn" 15. this .Text = "MyTestAddIn"; 16. } 17. 18. protected override void Invoke() 19. { 20. 21. } 22. 23. public override object Clone() 24. { 25. return new MenuItem(); 26. } 27. 28. #region IWinformsMenuHandler Members 29. 30. public System.Windows.Forms.ToolStripItem[] GetMenuItems() 31. { 32. ToolStripMenuItem item = new ToolStripMenuItem("MyTestAddIn"); 33. 34. //Подменю будет с названием "ConnectionString" 35. ToolStripMenuItem ConnectionString = new ToolStripMenuItem("ConnectionString"); 36. 37. ConnectionString.Tag = false ; 38. ConnectionString.Click += new EventHandler(ConnectionStringItem_Click); 39. item.DropDownItems.Add(ConnectionString); 40. 41. return new ToolStripItem[] { item }; 42. } 43. 44. #endregion 45. 46. void ConnectionStringItem_Click( object sender, EventArgs e) 47. { 48. //Выводим строку коннекции к выбранному серверу БД 49. MessageBox.Show( this .Parent.Connection.ConnectionString, 50. "ConnectionString", 51. MessageBoxButtons.OK, 52. MessageBoxIcon.Information); 53. } 54. 55. } 56. 57. }
В References добавим два компонента .Net: Далее выбираем куда установить нашу надстроечку и кому она будет доступна на данном компьютере (всем или только вам): Теперь запускаем SQL Server Management Studio, если вы всё сделали верно, указали и зарегистрировали все сборки, то у вас не будит никаких ошибок, иначе, при запуске SSMS, на экране получите ошибку ( А при удачной установке в основном меню появилось меню нашей сборки: Результат работы, которого - это вывод на экран строки подключения для текущего сервера БД: Таким образом, мы за 10 минут реализовали простейший ADD-IN для SSMS. Удалить настройку можно, как любой другой компонент/программу, установленные на вашем компьютере: |