Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

dev2dev

Zrób to sam – SSMS add-in (Start)

Gdy jakiś czas temu zainstalowałem sobie addin’a (dalej będę używał polskiego odpowiednika – wtyczka) do SSMS znanej specjalizującej się tym firmie byłem pod wrażeniem możliwości rozbudowy management studio. Ale po jakimś czasie wtyczka znudziła mi się i postanowiłem odinstalować ją. I po odinstalowaniu uruchomiłem ponownie SSMS i tu zdumienie: opcje wtyczki były nadal obecne w SSMS! Teraz wiem, że to nie przypadek. Moje doświadczenia pokazują, że zespól deweloperski odpowiedzialny za wtyczki do SSMS w tym czasie gdy powstawała ich koncepcja w Visual Studio pewnie koczował z obozem w okolicach wulkanu Katmai na Alasce.

Sama idea wtyczek jest bardzo interesująca ale zupełny brak oficjalnej dokumentacji do nich to trochę tak jak sytuacja z panienką, która “i chciałaby i się boi”. Dodatkowo każdemu kto chce coś w nich zrobić życie komplikuje fakt, że ich środowisko jest stworzone w technologii COM co znakomicie utrudnia odsłanianie ich wewnętrznej struktury nawet pod debugger’em. Trzeba zdobyć wiedzę o strukturze obiektu aby zrzutować go na odpowiedni typ, a i to nie zawsze jest możliwe.

Ale nie zrażając się trudnościami postanowiłem stworzyć własny dodatek do SSMS. I miałby to być dodatek wypełniający próżnię zarządzania obiektami Service Broker’a w SSMS. Wtyczka została przewrotnie nazwana Service Broken, a ojcem chrzestnym był Paweł Potasiński. Tyle o genealogii.

W tym cyklu chciałbym pokazać swoją drogę do stworzenia takowej wtyczki. Jeżeli masz inne doświadczenia na tym polu to chętnie je poznam.

Tworzona przez mnie wtyczka będzie przeznaczona dla SSMS 2008 ale ten sam przepis może być z powodzeniem wykorzystany do wersji 2005.

Tak więc zaczynamy!

 

I. Interfejsy

 

Wtyczka do SSMS to nic innego jak zwykłe assembly implementujące w sobie interfejsy hostujące obsługę zdarzeń. Są to dwa interfejsy:

IDTExtensibility2 – podstawowy interfejs odpowiedzialny za  zdarzenia ładowania i odłączania wtyczki oraz zmiany zachodzących w niej,

IDTCommandTarget – interfejs do obsługi named commands.

Aby zainicjować budowę wtyczki należy najlepiej tworzyć w nim projekt Visual Studio add-in z grupy Other Project Types –> Extensibility. W ten sposób wygenerowany wzorzec projektu implementuje jedynie pierwszy interfejs więc trzeba zmodyfikować klasę tak aby implementował również drugi interfejs. Po usunięciu zbędnych w tym wypadku komentarzy szkielet klasy wygląd następująco:

image

Obsługa zdarzeń z interfejsu IDTExtensibility2 układa się w sekwencję:

OnConnection, OnStartupComplete - w momencie uruchamiania SSMS

OnBeginShutdown,  OnDisconnection – w momencie zamykania SSMS.

Zdarzenia OnAddInsUpdate nie udało mi się zaobserwować w moim cyklu tworzenia wtyczki.

Do zaimplementowania interfejsu IDTCommandTarget wystarczą dwie metody:

image

Metoda QueryStatus weryfikuje status polecenia, gdzie parametr vsCommandStatusTextWanted przyjmuje następujące wartości:

vsCommandStatusTextWantedNone	- nie jest zwracana żadna informacja.
vsCommandStatusTextWantedName - zwracana jest nazwa polecenia.
vsCommandStatusTextWantedStatus - zwracany jest status polecenia.
Typ wyliczany vsCommandStatus przyjmuje następujące wartości nazwane:

vsCommandStatusEnabled – polecenie jest dozwolone.

vsCommandStatusInvisible – polecenie jest aktualnie ukryte.

vsCommandStatusLatched – polecenie jest chronione przed otwarciem (cokolwiek by to znaczyło :) ).

vsCommandStatusNinched – zarezerwowane do przyszłego użycia.

vsCommandStatusSupported – polecenie jest obsługiwane w bieżącym kontekście.

vsCommandStatusUnsupported – polecenie nie jest obsługiwane w bieżącym kontekście.

Aby polecenie wykonało sie należy ustawić flagi vsCommandStatusEnabled  oraz vsCommandStatusSupported .

Metoda Exec wymaga parametru typu vsCommandExecOption, który przyjmuje następujące wartości nazwane:

vsCommandExecOptionDoDefault – ma się wykonać się domyślne działanie.

vsCommandExecOptionDoPromptUser – polecenie ma się wykonać się po otrzymaniu danych od użytkownika.

vsCommandExecOptionPromptUser – polecenie ma się wykonać bez wymagania danych od użytkownika.

vsCommandExecOptionShowHelp – nastąpić ma tylko prezentacja help do polecenia bez wykonania go.

Pozostałe parametry są czytelne chyba bez dodatkowych wyjaśnień.

II. Parametry metody OnConnection.

 

Parametry tej metody zasługują na szczególne zainteresowanie.

1. connectMode – jest to parametr określający w jaki sposób następuje połączenie. Określa to również zachowanie tej metody:

image

- ext_cm_Startup - występuje wtedy gdy wtyczka jest dołączana z automatu (to jest przypadek dominujący w naszych zastosowaniach),

- ext_cm_AfterStartup – występuje wtedy gdy wtyczka jest dołączana z interfejsu użytkownika,

- ext_cm_UISetup – najbardziej tajemniczy tryb, który występuje tylko jednorazowo podczas pierwszej instalacji wtyczki. Jest przeznaczony do tworzenia UI dla niej. Jeżeli coś nie pójdzie prawidłowo podczas tej fazy to “żegnaj Pamelo” :). Moim zdaniem zupełnie bezsensowny tryb podłączania UI wtyczki. Zastosowałem własny, który przedstawię w następnych odcinkach. Ani razu nie udało mi sie uchwycić tego trybu pod sesją debugger’a.

2. addinst – instancja wtyczki.

3. application – jest to obiekt reprezentujący SSMS. W przypadku tworzenia wtyczki do SSMS 2008 ma bardzo interesującą cechę z punktu widzenia programisty: użycie go w formie poprawnie działającej w SSMS 2005, czyli

image

kończy się wyjątkiem. Dlatego należy zastosować następujące rozwiązanie, poprawnie działające dla obu serwerów:

image

Do projektu należy dołączyć referencje (ścieżki podane są dla domyślnej instalacji SQL Server):

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SqlEnum.dll

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.RegSvrEnum.dll

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll

C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\AppIDPackage.dll

C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlWorkbench.Interfaces.dll

C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.SqlTools.VSIntegration.dll

Dla serwera w wersji 2005 należy zamienić 100 na 90. Ostatecznie referencje powinny wyglądać następująco:

image

 

III. Przygotowanie do startu…

 

Ale zanim to nastąpi należy wykonać jeszcze kilka czynności.

1. Assembly należy podpisać:

image

2. Zarejestrować dla COM interop:

image

3. Ponieważ proces tworzenia wtyczki może wymagać odinstalowania i zainstalowania ponownego należy dodać do solucji Setup Project

image

Istotne jest również ustawienie w setupie opcji Registry:

image

Oraz w niej odpowiednich wpisów do rejestru:

image

4. Należy ustawić aplikację startową, czy wskazać ścieżkę do SSMS 2008:

image

ta ścieżka dla SSMS 3008 (w domyślnej instalacji) to:

C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe

(Ponownie dla wersji 2005 zamieniamy 100 na 90 ale również Ssms.exe na SqlWb.exe)

I to wszystko aby wykonać teraz…

image

a następnie długo oczekiwany

IV. Staaaaaart!!!

 

Naciskamy magiczny klawisz F5 i widzimy:

image

a za moment

image

Można teraz eksplorować obiekty naszej wtyczki korzystając z debugger’a (konieczne jest zapoznanie się ze strukturą obiektów zaprezentowaną tutaj). W następnym odcinku cyklu będziemy tworzyć menu oraz przekażę dobre rady jak należy pisać wtyczkę tak aby działała ona stabilnie.

Linki:

do następnego odcinka serii o tworzeniu wtyczki do SSMS >>>

Opublikowane 3 października 2009 00:23 przez marekpow

Komentarze:

 

dotnetomaniak.pl said:

Dziękujemy za publikację - Trackback z dotnetomaniak.pl

października 3, 2009 15:20
Komentarze anonimowe wyłączone
W oparciu o Community Server (Personal Edition), Telligent Systems