31/08/2011

Krótko o instalowaniu ServicedComponent

Home

W dwóch poprzednich artykułach na temat zarządzanych komponentów COM+ pisałem, że instaluje się je przy użyciu narzędzia regsvcs.exe. Tak oczywiście jest, ale ostatnio ku swojemu zaskoczeniu zauważyłem, że jest to opcjonalne. Jeśli nie zainstalujemy takiego komponentu z poziomu konsoli (np.: regsvcs.exe MyComponent.dll) to zostanie on zainstalowany automatycznie przy pierwszym wywołaniu jego konstruktora.
[assembly: ApplicationName("MyComponent")]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: System.Reflection.AssemblyKeyFile("MyComponent.snk")]
[assembly: ApplicationAccessControl(false)]
public class MyComponent: ServicedComponent
{
  ...
}

...

//Jeśli komponent nie został wcześniej zainstalowany to zostanie zainstalowany w tym momencie
using (MyComponent cmp = new MyComponent())
{
  ...
}


25/08/2011

Jeszcze o ServicedComponent

Home

W tym poście wrócę do tematu aplikacji modelu COM+ napisanych w kodzie zarządzanym, który to poruszyłem w poprzednim artykule. Tym razem chciałbym zwrócić uwagę na problem wersjonowanie takich komponentów. Upraszczając, chodzi o różnicę pomiędzy katalogiem, z jakiego komponent został zainstalowany w systemie, a katalogiem, w którym znajduje się biblioteka z komponentem jakiej używa dana aplikacja. W szczególności mogą to być inne katalogi np.: c:\Install oraz c:\bin.

W takim przypadku łatwo może dość do sytuacji, w której binaria w obu lokalizacjach będą się różnić. Objawy będą różne w zależności od trybu aktywacji (pisałem o nich poprzednio).W przypadku Aplikacji biblioteki tak długo jak w obu katalogach będą znajdować się biblioteki skompilowane dla tego samego środowiska (32 lub 64 bitowego) nie będzie żadnego problemu (poza bałaganem). Co ciekawe znaczenie ma tylko liczba bitów, wersje bibliotek mogą być inne, różna może być nawet liczba udostępnianych przez komponent metod. Natomiast w przypadku kiedy w jednym katalogu będzie wersja 32 bitowa, a w drugim 64 bitowa przy próbie skorzystania z komponentu dostaniemy wyjątek ComException o treści Klasa niezarejestrowana....

W trybie Aplikacji serwerowej liczba bitów nie ma znaczenia. Znaczenie ma jednak zawartość bibliotek w obu lokalizacjach. Jeśli będzie różna debugowanie nie będzie możliwe. Jeśli zmieni się interfejs, na przykład do biblioteki zostanie dodana nowa metoda, ale nowa wersja nie zostanie zainstalowana, to przy próbie jej użycia pojawi się wyjątek.

Generalnie problem dotyczy też natywnych komponentów COM+ (piekło COM+) ale z takimi komponentami nie pracowałem dlatego nie znam szczegółów.

23/08/2011

Debugowanie ServicedComponent

Home

ServicedComponent to klasa umożliwiająca tworzenie zarządzanych komponentów/klas, które mogą być użyte w aplikacjach COM+ oraz mogą korzystać z usług COM+. Jedną z takich usług jest na przykład pula obiektów, czyli coś podobnego do puli połączeń z tą różnicą, że możemy w niej umieścić instancje naszej własnej klasy.

Aby stworzyć taką specjalną klasę należy wydziedziczyć ją ze wspomnianej klasy ServicedComponent. Do tej pory nie miałem okazji z niej korzystać, dlatego napotkałem pewne kłopy przy debugowaniu takich zarządzanych komponentów COM+ (dalej będę używał po prostu pojęcia komponent).

Należy zacząć od tego, że są dwa tryby aktywacji komponentów COM+ (zarządzanych lub nie). W pierwszym (tzw. Aplikacja biblioteki/Library application) komponent aktywowany jest w procesie aplikacji, która z niego korzysta. W drugim trybie natomiast (tzw. Aplikacja serwera/Server application) aktywacja przeprowadzana jest przez dedykowany proces. Tworząc taki komponent możemy określić tryb aktywacji przy pomocy atrybutu ApplicationActivationAttribute. Tryb ten można również zmienić już po zainstalowaniu komponentu (przy pomocy narzędzia regsvcs.exe) w konsoli zarządzania w przystawce Usługi składowe (ang. Component services). Znajdziemy ją w lokalizacji C:\Windows\System32\comexp.msc.

Debugowanie takiego zarządzanego komponentu różni się w zależności od trybu aktywacji. Zacznijmy od pierwszego przypadku czyli tzw. Aplikacji biblioteki. Tutaj sprawa generalnie jest prosta. Skoro komponent aktywowany jest w procesie aplikacji, która z niego korzysta to wystarczy postawić pułapkę w odpowiednim miejscu np.: w kodzie komponentu i tyle. Jest jedno ale. To nie zadziała jeśli aplikacja korzystająca z komponentu została skompilowana na platformę .NET 4.0. Komponent będzie zwracał poprawne wyniki ale jak do tej pory nie udało mi się zmusić VS 2010 do zatrzymania się na pułapce ustawionej w kodzie komponentu albo przejść do tego kodu przy pomocy F11. Jeśli zmienimy platformę na przykład na .NET 3.5 to problem z debugowaniem nie wystąpi.

Trzeba również wiedzieć, że w przypadku tego trybu aktywacji, jeśli mamy zainstalowany komponent 32 bitowy, to proces, który chce z niego skorzystać również musi być 32 bitowy. Analogicznie dla 64 bitów. Informację o błędzie dostaniemy już przy próbie wywołania konstruktora komponentu.

W przypadku trybu "serwerowego" komponent aktywowany jest w innym procesie, więc wersja platformy czy nawet liczba bitów nie mają znaczenia (również przy debugowaniu). Z drugiej strony mamy inny problem ponieważ musimy doczepić się do tego procesu aby go zdebugować czyli skorzystać z funkcji Debug->Attach to Process.... Interesujący nas proces nazywa się dllhost.exe. Kłopot w tym, że na liście może znajdować się kilka procesów o tej nazwie. Pierwsze przybliżenie uzyskamy zawężając listę do tych procesów, które w kolumnie Type mają wartość Managed.... W przypadku gdy jest ich kilka można skorzystać z programu Process Explorer i sprawdzić identyfikator procesu, który korzysta z biblioteki z naszym komponentem.

W jednym z kolejnych postów wrócę jeszcze do tematu i napisze o problemach z wersjonowaniem omawianych komponentów.

22/08/2011

Londyn - metro (wskazówki)

Home

W ostatnim poście dotyczącym metra w Londynie obiecałem, że dam kilka wskazówek o tym jak z niego korzystać (o innych środkach transportu nie napiszę bo nie używam). Nie będzie to jakaś wiedza tajemna, ale kiedy jest się po raz pierwszy w Londynie, to nie wszystko jest oczywiste.
  • Nie opłaca się kupować biletów za gotówkę. Tak zakupiony bilet dla pierwszej strefy, w porównaniu do biletu elektronicznego, może być nawet 2 razy droższy. Dla dalszych stref różnica jest mniejsza, ale na przykład większość atrakcji turystycznych znajduje się w pierwszej strefie.
  • Osobiście korzystam z karty Oyster czyli odpowiednika Warszawskiej Karty Miejskiej z tą jednak różnicą, że Oyster oferuje więcej możliwości. Na taką kartę można załadować bilet okresowy, ale również określoną sumę pieniędzy do wydania na przejazdy tzw. pay as you go. Z metra korzystam raz na jakiś czas więc jest to dla mnie idealne rozwiązanie.
  • Kartę Oyster kupujemy (ładujemy) w automatach biletowych ustawionych w metrze lub w kasach. Przy zakupie zostanie pobrany zwrotny depozyt wysokosci 5 funtów.
  • Nie na każdej stacji znajdziemy kasy biletowe, automaty natomiast tak.
  • Ważne!!!Korzystając z karty Oyster trzeba koniecznie pamiętać żeby zbliżyć kartę do czytnika (oznaczone sa charakterystycznymi żółtymi kółkami) przy wejściu ale i przy wyjściu z metra. W innym wypadku zostaniemy obciążeni dodatkową opłatą (nie wiem ile dokładnie). W większości wypadków nie ma z tym problemu ponieważ nie przejdziemy przez barierki bez ważnego biletu. Niestety na niektórych stacjach nie ma barierek. Czasami zdarzy się również, że barierki są otwarte ale wtedy też trzeba pamiętać o czytniku.
  • Po zarejestrowaniu karty Oyster na tej stronie będziemy mogli śledzić historię naszych podróży oraz doładować kartę on-line. Jeśli chcemy kupić bilet okresowy na czas dłuższy niż tydzień rejestracja jest wymagana.
  • Ważne!!! Jeśli mamy kartę pay as you go to mamy zagwarantowane, że danego dnia nie wydamy na przejazdy więcej niż koszt biletu dziennego. Szczegóły można znaleźć tutaj.
  • Warto korzystać ze strony Transport for London. Znajdziemy tam bardzo dobrą wyszukiwarkę połączeń oraz informacje o planowanych remontach poszczególnych linii. Generalnie remonty przeprowadzane są w weekendy.
  • Nie wszystkie stacje metra mają windę.
  • Na stacjach metrach można znaleźć broszurki z planem metra - bardzo przydatne.
  • Jeśli ktoś źle znosi wysokie temperaturę lub duchotę, to schodząc do metra (szczególnie korzystając z linii głębinowych) warto zaopatrzyć się w butelkę wody.
  • Szczegółowy cennik znajdziemy tutaj
Linki do poprzednich postów z serii na temat życia w Londynie:

18/08/2011

Londyn - zamieszki

Home

Z publikacją tego posta czekałem aż zamieszki w Londynie ucichną i sprawa zostanie zapomniana przez media. No i się doczekałem. Obecnie w polskich mediach ciężko znaleźć jakąś wzmiankę na ten temat podczas gdy jeszcze jakiś czas temu można było odnieść wrażenie, że Londyn to strefa wojny.

O zamieszkach usłyszałam po raz pierwszy, kiedy spytała mnie o nie żona. Potem także rodzina i znajomi pytali mnie czy nic mi nie jest, czy jestem bezpieczny itd. Nie dziwię się temu, bo kiedy przeglądam artykuły na temat zamieszek, okraszone strasznymi zdjęciami, to przyznam, że nie wyglądało to fajnie. Osobiście oprócz większej liczby policjantów na ulicach nie widziałem innych skutków rozruchów.

To pokazuje jaka może być różnica pomiędzy rzeczywistością, a obrazem świata przedstawianym przez prasę. Nie twierdzę, że problemu nie było bo problem oczywiście był (jest) i to duży. Wielu ludzi zostało poszkodowanych i przeżyło ciężkie chwile. Ale tak nie było w całym mieście. W tym samym czasie, wbrew temu co pokazywały media, w Londynie toczyło się normalne życie.

Linki do poprzednich postów z serii na temat życia w Londynie:

07/08/2011

Kłopoty z Client Profile

Home

The type or namespace name 'SomeType' does not exist in the namespace 'SomeNamespace' (are you missing an assembly reference?)

Sądzę, że każdy programista .NET spotkał się z powyższym błędem kompilacji. Nie jest to nic wyjątkowego i rozwiązanie problemu jest bardzo łatwe, wystarczy dodać do projektu referencję do brakującej biblioteki. Czy oby na pewno?

Kilka dni temu napotkałem powyższym błąd kompilatora i rozwiązanie problemu zajęło mi sporo więcej czasu niż normalne kilkanaście sekund. Na początku zdziwiłem się ponieważ niekompilujący się projekt aplikacji zawierał potrzebną referencję, kilka minut wcześniej sam ją dodałem. Na wszelki wypadek podpiąłem ją jednak jeszcze raz i przekompilowałem wszystkie potrzebne projekty ale nic to nie dało. Restart Visual Studio również nie pomógł. Kilka kolejnych prób kompilacji również spełzło na niczym.

Trochę zrezygnowany zabrałem się do przeglądania ustawień felernego projektu i zwróciłem uwagę na to, że korzysta on .NET Framework 4 Client Profile. Wcześniej nie miałem z tym problemu ale przypomniałem sobie, że w projektach tego typu nie można korzystać z bibliotek, których nie ma w NET Framework 4 Client Profile. Na próbę zmieniłem opcję Target framework na .NET Framework 4 i okazało się to strzałem w dziesiątkę.

W ramach testu zacząłem zmieniać różnym projektom opcję Target framework na .NET Framework 4 Client Profile i sprawdzać czy się kompilują. Okazało się, że prawie wszystkie skompilowały się bez żadnego problemu. Dalsze eksperymenty doprowadziły mnie do następującego wniosku:

Błąd zostanie zgłoszony jeśli w projekcie korzystającym z NET Framework 4 Client Profile użyjemy biblioteki, która bezpośrednio lub pośrednio korzysta z czegoś co nie znajduje się w NET Framework 4 Client Profile.

Przez użyjemy rozumiem np.: stworzenie instancji klasy. Samo dodanie referencji do biblioteki czy nawet zaimportowanie przestrzeni nazw przy pomocy using nie spowoduje błędu. Ważne jest również to, że biblioteka powodująca błąd może znajdować się gdzieś daleko w łańcuchu referencji, co jeszcze utrudnia sprawę. Należy również wiedzieć, że o przynależności lub nie do NET Framework 4 Client Profile nie decydują opcje kompilacji ale to z czego korzystamy w danej bibliotece. Listę "zabronionych" rzeczy można znaleźć tutaj. W moim przypadku błąd powodowała "zabroniona" biblioteka System.Data.OracleClient, z której korzysta Microsoft.Practices.EnterpriseLibrary.Data.dll, którą z kolei używam ja.

Sądzę, że warto o tym pamiętać aby zaoszczędzić sobie nerwów szczególnie, że kiedy dodajemy nowy projekt aplikacji (WPF, WinForms, konsola) to domyślnie będzie on korzystał .NET Framework 4 Client Profile. W większości przypadków jest to dla nas przezroczyste ale zawsze może trafić się ten jeden raz.

01/08/2011

Londyn - metro (trochę narzekania)

Home

Dzisiaj napiszę o metrze londyńskim, które należy do najstarszych i najbardziej rozbudowanych na świecie, a z którego w porównaniu do innych środków transportu korzystam najczęściej. Dwanaście linii wijących się pod miastem w porównaniu do jednej budowanej 25 lat w Warszawie robi wrażenie i budzi zazdrość. Ja chciałbym jednak pokazać, że jeśli choć na chwilę zapomnimy o liczbie linii to metro warszawskie zacznie wygrywać z londyńskim pod wieloma względami.

Zacznę od tego, że w londyńskim metrze jest bardzo duszno i gorąco. Nawet jeśli na dworze jest zimno i założyliśmy kurtkę to po zejściu do metra z pewnością ją zdejmiemy. Na przewarzającej liczbie stacji i w pociągach niestety brakuje klimatyzacji. Czytałem, że w najbliższym czasie na jednej z linii mają zostać wprowadzone pociągi z klimatyzacją ale to kropla w morzu potrzeb. Póki co przemieszczanie się metrem to przyjemnych nie należy, a zarząd metra zaleca aby w podróż wybrać się z butelką wody.

Komfortu nie poprawia fakt, że stacje w londyńskim metrze są bardzo małe, szczególnie te głębinowe. Jest akurat tyle miejsca aby zmieścił się pociąg i niewiele więcej. Biorąc pod uwagę to co widziałem, tak na oko przeciętna szerokość peronu to 3-4 metry. Pod tym względem Warszawa bije Londyn na głowę. Mniejsze są również wagony (z ciekawostek to na poszczególnych liniach mają różne rozmiary). W Warszawie bez problemu stoję wyprostowany, w Londynie mieszczę się po środku wagonu.

W londyńskim metrze brakuje również tzw. komór rozprężających powietrze. Powoduje to, że pociąg wjeżdżający na stację wpycha przed sobą ogromną masę powietrza, która uderza w pasażerów. Może to i drobiazg ale pokazuje, że metro w Warszawie należy do nowoczesnych. Potwierdza to, również fakt, że wszystkie stacje metra w Warszawie przystosowane są dla niepełnosprawnych (mam na myśli windy), a w Londynie nie.

Z innych rzeczy to jadąc metrem w Londynie mam wrażenie, że tory do najprostszych nie należą. Obserwując wagon jadący przed nami albo za nami można zauważyć jak nim rzuca, czasami jest jakby trochę wyżej, a czasami niżej :). Metro w Londynie jest również po prostu drugie, nawet biorąc pod uwagę wyższe zarobki. Koszt jednego przejazdy w ramach pierwsze strefy to na tą chwilę 1.9 funta szterlinga i to przy założeniu, że korzystamy z karty magnetycznej (tzw. Oyster). Tradycyjne bilety są jeszcze droższe.

Tyle narzekania. Ideałem byłoby metro nowoczesne jak w Warszawie ale z taką liczbą linii jak w Londynie (może moje wnuki tego doczekają). W kolejnych postach chciałbym dać kilka wskazówek jak korzystać z metra w Londynie.

Linki do poprzednich postów z serii na temat życia w Londynie: