BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Visual Studio .NET Add-In

30-11-2004 12:37 | User 79341
W codziennej pracy programista musi korzystać z bardzo wielu narzędzi – poza samym środowiskiem Visual Studio. Bardzo często potrzebuje skorzystać z komunikatora, poczty email, przeglądarki, czy też grup dyskusyjnych. Coraz więcej z tych rzeczy można już spotkać jako zintergrowane pakiety pracy grupowej, ale nie zapominajmy o samym środowisku VS – w artykule opowiem o Add-In’ach (dodatkach). Przykładem dołączonym do artykułu jest czytnik grup dyskusyjnych.

Visual Studio .Net

Środowisko programowania jakim jest Visual Studio, z edycji na edycję zawiera coraz więcej przydatnych narzędzi. Jednakże dość często potrzebujemy niestandardowego narzędzia, którego nie da się bezpośrednio zintegrować ze środowiskiem – jak chociażby różnego typu komunikatory, czy też poczta email. Co wówczas nam (programistom) pozostaje ? Odpowiedzi są dwie : albo pozostanie przy starych schematach i uruchamianie każdej aplikacji osobno, albo stworzenie dodatków które zintegrują naszą aplikację zewnętrzną wewnątrz środowiska VS – i przy tej odpowiedzi pozostaniemy w tym artykule.

 

Automatyzacja

Model automatyzacji, czy też model rozszerzeń (ang. „extensibility model”), dotyczy automatyzacji, programowego przejęcia kontroli, czegokolwiek w środowisku – od makr, poprzez narzędzia,  do przeróżnych ustawień. Model automatyzacji VS pozwala na kontrolę i rozszerzanie całego środowiska IDE. Model pozwala na dowolny programistyczny dostęp poprzez obiekty i interfejsy do praktycznie każdego okna (Toolboxy, Code Editor, Solution Explorer itd.), pozwala kontrolować każdy element środowiska – edycję kodu, debuging, czy też konfigurację.

 

 

 

Na powyższym rysunku przedstawiony mamy schematyczną budowę modelu automatyzacji. Każdy z modeli składa się z różnej liczby obiektów poprzez które mamy dostęp do rozmaitych funkcji środowiska. I tak na przykład funkcje związane z obsługą edytora mamy w modelu Editor, funkcje kodu w modelu Code, czy też funkcje całego projektu w modelu Project. Na rysunku jest drobny błąd (pochodzi on z MSDN) – zamiast Common powinien być Core Environment Model – kontroluje on podstawowe elementy Visual Studio .Net, i inne modele są w jakiś sposób zależne od jądra.

 

Bardziej szczegółowy schemat automatyzacji z rozbiciem na poszczególne obiekty można  znaleźć na stronach MSDN.

 

 

Jak możemy zauważyć – mamy dostęp do naprawdę wielu obiektów, z czego dziś pokaże tylko dwa.

 

W jaki sposób możemy uzyskać dostęp do automatyzacji ?

Istnieją trzy drogi dostępu :

- makra VS (ang. VSMacros)

- dodatki i kreatorzy (ang. Add-Ins and Wizards)

- projekt integracji VS (VSIP)

 

Makra Visual Studio

Najogólniej mówiąc są to polecenia, akcje w środowisku które można wykonać ruchem myszy, połączone w jednen zestaw, umożliwiający wykonanie wielu poleceń przy pomocy pojedyńczego kliknięcia (uruchomienia makra). Do tworzenia makr służy osobne środowisko VSMacros IDE, oparte na Visual Basicu .NET. Więcej na temat makr na stronach Microsoftu.

 

Visual Studio Integration Program

Jeżeli nasze wymagania co do integracji w Visual Studio rosną – chcemy dodać całkowicie nowy język (nie tylko prosty dodatek który wykona odpowiedni kompilator z linii poleceń) – to musimy skorzystać z VSIP SDK. Jest to program przeznaczony dla poważniejszych partnerów firmy Microsoft.

 

Dodatki i kreatorzy

Celem tego artykułu są właśnie dodatki do VS. W przeciwieństwie do makr, dodatki są w pełni skompilowanymi aplikacjami, napisanymi w dowolnym języku pozwalającym na interakcję z obiektami COM (na przykład Visual C++ czy C#). Dodatki potrafią rzeczy których przy pomocy makr się nam nie uda zrobić – dodatkowe palety ustawień, dodatkowe okna, dynamicznie dodawane komendy w menu środowiska.

Dodatek tworzymy jako obiekt COM, implementujący interfejs IDTExtensibility2, lub też IDTWizard. Głowne obiekty modelu automatyzacji znajdują się w bibliotece EnvDTE (Microsoft Development Environment 7.0) – dzięki niej mamy dostęp m.in. do IDE, edytora, kodu, czy też do debugowania.

 

Oczywiście nie będziemy pisać wszystkiego od zera, gdyż posiadamy odpowiednie kreatory w Visual Studio. Zaczynamy od wybrania projektu „Visual Studio .NET Add-In”

 

 

 

Możemy również utworzyć „Shared Add-In”, czyli dodatek dla wielu różnych produktów firmy Microsoft – między innymi dla Worda, Excela, Projecta czy też Outlooka.

 

Następnie kreator się będzie pytał o szczegóły projektu – język w jakim chcemy pisać, aplikacje dla których ma to być dodatek, nazwę, opis, oraz inne (każdy element jest opatrzony komentarzem, więc pozostawię to do samodzielnego sprawdzenia).

 

Przyjrzyjmy się co też kreator nam przygotował

Add-In może implementować następujące metody interfejsu IDTExtensibility2 :

- OnConnection – wywoływana jest w momencie ładowania dodatku, otrzymujemy między innymi informację o tym w jaki sposób dodatek jest ładowany

- OnDisconnection – wywoływana w momencie wyłączenia dodatku

- OnStartupComplete – wywoływana po załadowaniu się środowiska (może to być Visual Studio, jak też na przykład Word)

- OnAddInsUpdate – powiadomienie o zmianach w kolekcji dodatków

- OnBeginShutdown – powiadomienie o zamykaniu środowiska; przydatne aby na przykład zapisać konfigurację

 

Metoda OnConnection

Podczas ładowania dodatku możemy utworzyć przyciski dostępowe – czyli elementy które możemy umieścić w dowolnym miejscu środowiska, którego kliknięcie wywoła odpowiednią reakcję naszego dodatku.

Oto odpowiedni kawałek kodu tworzący prosty przycisk :

 

if (connectMode == Extensibility.ext_ConnectMode.ext_cm_UISetup || connectMode == Extensibility.ext_ConnectMode.ext_cm_Startup || connectMode == Extensibility.ext_ConnectMode.ext_cm_AfterStartup)

{

      object[] contextGUIDS = new object[] { };

      Commands commands = applicationObject.Commands;

      _CommandBars commandBars = applicationObject.CommandBars;

 

Command command = commands.AddNamedCommand(addInInstance, "VSNewsReader", "VSNewsReader", "Przywolanie okna Add-In'a VS News Reader", true, 65, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled);

      CommandBar commandBar = (CommandBar)commandBars["Tools"];

      CommandBarControl commandBarControl = command.AddControl(commandBar, 1);

}

 

Warunek który sprawdzamy dotyczy trybu uruchomienia dodatku – sprawdzamy takie tryby jak załadowanie przy uruchomieniu środowiska (Startup) czy też już po uruchomieniu środowiska (AfterStartup). Następnie tworzymy obiekt przycisku, nadajemy mu nazwę, opis, ikonę, po czym umieszczamy w menu Tools.

 

Kreator którym tworzyliśmy projekt zaproponował nam dodanie przycisku, po czym stworzył dla nas odpowiednie implementacje interfejsu IDTCommandTarget. Przyjrzyjmy się metodzie Exec wspomnianego interfejsu :

 

public void Exec(string commandName, EnvDTE.vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)

{

      handled = false;

if(executeOption == EnvDTE.vsCommandExecOption.vsCommandExecOptionDoDefault)

      {

            if(commandName == "VSNewsReader.Connect.VSNewsReader")

            {

                  pokazOkno();

            }

      }

}

 

Metoda ta przekazuje nam do obsługi takie parametry jak commandName – nazwa komendy do wykonania – akurat w tym przypadku przechwytujemy komendę Connect dotyczącą naszego dodatku (przestrzeń VSNewsReader, klasa VSNewsReader); executeOption – parametr mówiący o tym jak akcja powinna zostać wykonana (czy powinno być jakieś pytanie do użytkownika, czy też jest to zwykłe kliknięcie); oraz dodatkowe parametry które można przekazać podczas wywołania komendy. My zaimplementujemy tu tylko pokazanie okna naszego dodatku.

 

Teraz trochę na temat samego okna

Otóz jak się okazuje bez pakietu VSIP wyświetlenie własnego okienka nie jest prostą sprawą – okienko powinno być kontrolką ActiveX. W C# nie stworzymy kontrolki ActiveX, więc musimy się posłużyć mechanizmem zwanym Intertop (czyli wywołaniem kodu niezarządzalnego) z poziomu C#. Skorzystamy z powiedzenia „Write Once, Use Anywhere” i skorzystamy z gotowej, przeznaczonej do tego celu biblioteki - VSUserControlHostLib, której kod źrodłowy dostarczają programiści Microsoftu przy okazji przykładowego dodatku do VS. Po dodaniu referencji do biblioteki, możemy utworzyć okienko, które poprzez ATLową kontrolkę ActiveX zostanie osadzone wewnątrz środowiska Visual Studio.

 

// wcześniej zadeklarowane w metodzie OnConnection

private _DTE applicationObject = (_DTE)application;

private AddIn addInInstance = (AddIn)addInInst;

 

private Window okno;

private VSUserControlHostLib.IVSUserControlHostCtl objControl;

// funkcja odpowiedzialna za zadokowanie głównego okna aplikacji

private void pokazOkno()

{

      object obj = null;

      okno = applicationObject.Windows.CreateToolWindow(addInInstance, "VSUserControlHost.VSUserControlHostCtl", "VS.NET News Reader", "{E5A2A3C8-0C88-4790-8FBB-4D4C404E69E5}", ref obj);

      okno.Visible = true;

      objControl = (VSUserControlHostLib.IVSUserControlHostCtl)obj;

      System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();

      objControl.HostUserControl(asm.Location, "VSNewsReader.glowneOkno");

}

 

Najpierw tworzymy obiekt okna korzystając z obiektu Windows modelu automatyzacji, ustawiamy jego widoczność po czym tworzymy obiekt kontrolki ActiveX i osadzamy w nim glowneOkno() naszego dodatku.

 

Konfiguracja dodatku

Pozostało nam dodanie opcji konfiguracyjnych naszego programu do okienka „options” środowiska. To jest akurat najłatwiejsze zadanie – załatwia to wpis w rejestrze :

 

w kluczu HKLM\Software\Microsoft\VisualStudio\7.1\AddIns\VSNewsReader.Connect\Options\VSNewsReader\Settings

 

ustawiamy podklucz Control na nazwę klasy reprezentującej nasze okno (w tym przypadku „Control = VSNewsReader.glowneOpcje”).

 

Przykładowa aplikacja

Jako przykład do artykułu stworzyłem klienta grup dyskusyjnych – popularny protokół NNTP. Sam proces łączenie i pobierania wszelkich danych z serwera, w myśl zasady „Write Once, Use Anywhere” pozostawiłem komponentowi autorstwa człowieka o pseudonimie HKcow. Nie jest on idealny, stąd wiele błędów (jak na przykład brak obsługi innych standardów kodowania znaków, niepoprawne przekształcenia typów Mime i Base64).

Pare zrzutów z aplikacji :

 

 

konfiguracja

 

Widzimy tu okienko konfiguracyjne (pobranie grup z serwera, wybór subskrybowanych grup) zadokowane wewnątrz palety konfiguracyjnej środowiska (Tools->Options).

 

 

przeglądanie grupy

 

Na powyższym zrzucie widzimy wygląd okna obiektu glowneOkno(), z listą wiadomości na grupie, listą grup, oraz podglądem treści. Mamy tu też przyciski do odświeżenia listy grup, pobrania nowych wiadomości, napisania nowej czy też odpowiedzi na widomość. Okno zostało zadokowane wewnątrz środowiska na belce razem z Class Viewerem, Solution Explorerem i innymi okienkami.

 

Warto jeszcze wspomnieć – tak poza głównym tematem artykułu – gdzie aplikacja przechowuje pliki tworzone w trakcie pracy (lista nagłówków, lista grup itp.). Skorzystałem tu z tak zwanego IsolatedStorage – katalog tworzony na dysku na potrzeby konkretnego assembly – tworzony w katalogu <SYSTEMDRIVE>\Documents and Settings\<user>\Ustawienia Lokalne\Dane Aplikacji\. Odwołanie z innego projektu platformy .Net do IsolatedStorage zwróci inny katalog, dzięki czemu nie musimy się martwić o to gdzie przechowywać pliki tak aby każdy użytkownik miał możliwość personalizacji, oraz gdzie będą bezpieczne.

 

Na zakończenie

Artykuł ten był szybkim przekrojem przez technologię rozszerzeń Visual Studio .Net, wraz z prostym przykładem pokazującym w jaki sposób szybko osadzić ulubioną aplikację wewnątrz środowiska. Automatyzacja środowiska programistycznego jest tak szerokim zagadnieniem, iż na tej podstawie może powstać naprawdę sporo artykułów, co sam też będę kontynuował.

I jeszcze standardowo bibliografia :

 

Witryna firmy Microsoft poświęcona rozszerzeniom Visual Studio

Miejsce od którego warto zacząć (MSDN)

Artykuły na temat IsolatedStorage o którym mowa pod koniec

Załączniki:

Komentarze 5

xqsnake
xqsnake
8 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0
zainstalowalem ten plugin i nic :p okienko konf jest i działa ale nie ma zadokowanego okna w VSie przeszukałem wszędzie!
xqsnake
xqsnake
8 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0
4 bo:
+ czytleny i zrozumialy jezyk
+ w koncu add-iny
- przetłumaczony MSDN
- raptem 20 lini kodu
- news reader? a kto tego używa w VSie?
- nie do końca działająca wersja wykonywalna
   (kodu już mi się nie chciało sprawdzać)
- mały wkład autora

xqsnake
xqsnake
8 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0
oczywiscie 20 to liczba linii kodu dotycząca add-inu ;)

User 79341
User 79341
39 pkt.
Poczatkujacy
21-01-2010
oceń pozytywnie 0
Przepraszam, nie zauwazylem wczesniej iz instalator tego nie robi - biblioteka VSUserControlHostLib.dll wymaga rejestracji - mozna to wykonac poprzez wykonanie polecenia : regsvr32 x:\sciezka\VSUserControlHostLib.dll
User 79341
User 79341
39 pkt.
Poczatkujacy
21-01-2010
oceń pozytywnie 0
Jeszcze raz przepraszam - oczywiscie chodzi o VSUserControlHost.dll
pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.