Tips’n’Tricks – peverify

Od pewnego czasu walczę z mono cecil z mniejszym i większym powodzeniem, w trakcie walk znajduje na forach różne przydatne podpowiedzi, postanowiłem je zebrać w ramach krótkich wpisów. O mono też się pojawi wpis, ale jak już zrobię to na czym mi zależy i w dodatku będzie działać 🙂
Teraz słów kilka o peverify.exe.

PEVERIFY.EXE

Gdy chcemy się pobawić trochę systemem refleksji w c# czy hakować zasoby, czy w jakikolwiek inny sposób ingerować w skompilowany kod aplikacji pisanej w .net, a następnie mieć pewność że wszystko jest w porządku i nie zakłóciliśmy jej wewnętrznej harmonii warto sprawdzić ją przy pomocy peverify.
Sposób użycia jest banalnie prosty, jako parametr aplikacji podaje się nazwę programu do sprawdzenia i czeka na wynik.
Tak wygląda wynik takiej operacji:

Zakolorowałem część nazwy aplikacji, nigdy nie wiesz czy ktoś się nie wkurzy jak mu wytkniesz jego błędy 😉

Pierwszy widoczny błąd (stack underflow) to akurat moja wina, dodałem do kodu wywołania swojej funkcji, ale zapominałem wcześniej załadować pewien argument i proszę wszystko widać, nawet podaje linijkę gdzie wystąpił błąd. Reszta to rzeczy odziedziczone, co ciekawe widać aplikacja nie musi być idealna by można było z niej korzystać.
Aby uruchomić peverify wystarczy odpalić Visual Studio Command Prompt i działa, oczywista oczywistość można dodać sobie odpowiednie ścieżki do PATH i nie bawić w linie poleceń do msvc.

To tyle, krótko i na temat.

Palcem po mapie – CultureInfo w natarciu

Przygotowania do 70-536 idą sobie idą. Miałem ostatni mały sparing z CultureInfo, zatem trzeba się podzielić wiedzą, którą wyniosłem z tej krótkiej walki.
CultureInfo zawiera wszystkie informacje, których będziemy potrzebować, żeby aplikacja była poprawnie językowa (oczywiście trzeba znać jeszcze język obcy). Zaczynając od tego po której stronie kartki zaczynamy pisać, poprzez znak oddzielający ułamek od części całkowitej, powoli sunąc przez nazwę kalendarza, który jest używany i wreszcie kończąc na znaku, którym oznacza się nieskończoność. To tylko część z informacji, które posiada ta klasa.
Z CultureInfo można skorzystać poprzez podanie go jako parametr IFormatProvider (ToString, string.Format, StringBuilder.AppendFormat) lub poprzez ustawienie go w aktualnym wątku jako aktualną kulturę metodą Thread.CurrentThread.CurrentUICulture = myNewCultureInfo;
Kawałek kodu, dzięki któremu można się bliżej poznać z kulturami z całego świata. Wszystko dzięki wbudowanemu wsparciu dla multi-kuli w windows.

  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3.     foreach (var ci in CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures))
  4.     {
  5.         this._avaiableCultures.Items.Add(ci.Name + „, „+ci.EnglishName+”( „+ci.NativeName+” )”);
  6.     }
  7.     this._avaiableCultures.SelectedIndex = 0;
  8. }
  9.  
  10. private void _avaiableCultures_SelectedIndexChanged(object sender, EventArgs e)
  11. {
  12.     string culture = this._avaiableCultures.SelectedItem.ToString().Substring(0,
  13.                      this._avaiableCultures.
  14.                      SelectedItem.ToString().
  15.                      IndexOf(„,”));
  16.  
  17.     StringBuilder sb = new StringBuilder();
  18.     CultureInfo ci = new CultureInfo(culture);
  19.     sb.AppendLine(„CALENDAR:”);
  20.     sb.AppendLine(ci.DateTimeFormat.NativeCalendarName);
  21.     sb.AppendLine(„DAYS:”);
  22.     foreach (var dayName in ci.DateTimeFormat.DayNames)
  23.     {
  24.         sb.AppendLine(dayName);
  25.     }
  26.     sb.AppendLine(„MONTHS:”);
  27.     foreach (var monthName in ci.DateTimeFormat.MonthNames)
  28.     {
  29.         sb.AppendLine(monthName);
  30.     }
  31.  
  32.     sb.AppendFormat(„NUMBERS:nFractions go after: {0}n”, ci.NumberFormat.CurrencyDecimalSeparator);
  33.     sb.AppendFormat(„Currency symbol: {0}n”, ci.NumberFormat.CurrencySymbol);
  34.     sb.AppendFormat(„Infinite symbol: {0}n”, ci.NumberFormat.PositiveInfinitySymbol);
  35.     this._localizedInfo.Text = sb.ToString();
  36.    
  37.     //CultureInfo myNewCultureInfo = new CultureInfo(culture);
  38.     //Thread.CurrentThread.CurrentUICulture = myNewCultureInfo;
  39.  
  40.     this._moneyValue.Text = string.Format(ci, „{0:C}”, 12345.67);
  41.     this._currentTime.Text = DateTime.Now.ToString(ci);
  42.  
  43.     if( ci.TextInfo.IsRightToLeft )
  44.     {
  45.         this._currentTime.RightToLeft = RightToLeft.Yes;
  46.         this._avaiableCultures.RightToLeft = RightToLeft.Yes;
  47.         this._currentTime.RightToLeft = RightToLeft.Yes;
  48.         this._localizedInfo.RightToLeft = RightToLeft.Yes;
  49.         this._moneyValue.RightToLeft= RightToLeft.Yes;
  50.     }
  51.     else
  52.     {
  53.         this._currentTime.RightToLeft = RightToLeft.No;
  54.         this._avaiableCultures.RightToLeft = RightToLeft.No;
  55.         this._currentTime.RightToLeft = RightToLeft.No;
  56.         this._localizedInfo.RightToLeft = RightToLeft.No;
  57.         this._moneyValue.RightToLeft = RightToLeft.No;
  58.     }
  59. }

Komentarz:
@01 – Na załadowanie formy, odczytuje wszystkie wspierane kultury. Następnie wrzucam informacje o nich do combobox.
@12  – Po wybrania innej kultury, sprawdzam jej skróconą nazwę.
@18 – Tworzę nową oraz wypisuje na jej podstawie nazwę kalendarza (@20), wszystki dni(@21), wszystkie miesiące(@26). Na koniec podstawowe jednostki płatnicze(@32). Przed wyjściem sprawdzam, czy w danej kulturze pisze się od lewej czy od prawej (@43) i aktualizuje kontrolki.

A tak wygląda aplikacja w działaniu:

Środowisko programistyczne

Jak pisałem uczę się Androida i jednocześnie piszę mały projekcik w C#, mam więc dobrą okazję do porównani dwóch środowisk programistycznych. Projekt w C# pisany jest w msvc2k8, do nauki Androida używam Eclipse 3.4 plus pakiet ADT od Google. Od razu powiem, że nigdy nie przepadałem za Eclipsem, ale postaram się być obiektywny i dać mu szansę.

Edytor to w zasadzie kwestia gustu i dobrania kolorów, co kto lubi i co uznaje za wygodne. Szybkość edytora i działanie inteli-sens jest w obu przypadkach w porządku, na plus Eclipsa wypada dobry system podpowiedzi generowany z dokumentacji znajdującej się w kodzie. Nie korzystam z tej funkcjonalności, ale doceniam ją i co najważniejsze nie przeszkadza w pisaniu. Microsoft w VC2k8 postarał się o edytor dla C# i pisanie kodu dla tego języka to czysta przyjemność. Szybkie podpowiedzi, generowanie stub funkcji dla delegatów czy innego ustrojstwa to piękna sprawa.

Kompilacja/build w obu IDE edytor na bieżąco informuje o problemach ze składnią czy literówkach. Eclipse pozwala na wyłączenie tej opcji w VC nie wiem, nie sprawdzałem bo nie miałem takiej potrzeby. Niestety w Eclipse domyślne ustawienia CTRL+B dla builda nie chce tak do końca dobrze działać z każdego miejsca w edytorze i często trzeba i tak kliknąć opcje build z menu żeby ruszy – ale to pierdółki.

Debug/runtime tutaj niestety często kończy się moja cierpliwość dla Eclipse. Szczegóły: wybieram opcje Project->Run i okazuje się, że jednak pomimo tego, że jakimś cudem udało się zbudować projekt nie wszystko jest poprawnie i trzeba poprawiać. Nie wiem, nie znam się, może to wina ADT – nie interesuje mnie to. Dla mnie i tak jest to Eclipse. Dalej – aplikacja po dłuższej walce i poprawkach pozwala wreszcie na uruchomienie się na emulatorze. Pojawia się komunikat jak z poprzedniego posta – nie wiem o co chodzi, szukam, walczę, pocę się nie miłosiernie, nic nie kumam. Znowu mija czas. Wreszcie po przełączeniu się na odpowiedni widok jest jakaś informacja o tym co poszło nie tak. To chyba nie to chodzi? Środowisko powinno ułatwiać pracę , a nie przyprawiać go o ataku szału. Możemy sobie psioczyć na Microsoft, ale uważam i pewnie długo jeszcze będę tego zdania, że Visual Studio to najlepszy pakiet programistyczny z jakim dane mi było pracować. Tam wszystko działa tak jak powinno, pracuje mi się z tym bardzo intuicyjnie, jeżeli coś nie działa to wszystkie informacje znajduję w jednym okienku.

Cena – jasne, za pakiet z ms trzeba zapłacić jeżeli chce się mieć wypasioną wersje. Choć teraz można korzystać całkiem przyjemnie z VC w wersji express, która też sprawuje się całkiem przyjemnie. Eclipse jest całkowicie za darmo i fajnie. Ale jak przeczytałem gdzieś na dzone (o ile dobrze pamiętam) – na rzeczy i usługi, które otrzymujemy za darmo patrzymy z lekkim podejrzeniem. Tutaj zapożyczę sobie przykład, który brzmi mniej więcej tak: „czy oddalibyście bliską osobę do chirurga, który wykona operacja za przysłowiowego browara czy tego który będzie żądać od was jakieś opłaty za przeprowadzenie operacji” i od siebie: wszystko co dobre kosztuje.

Nie chce wystawiać oceny żadnemu z tych programów, moje negatywne nastawienie do Eclipse, to pewnie wina tego, że nie zdążyłem się jeszcze z nim w pełni zapoznać. Może musi minąć trochę czasu i odkryje wreszcie cały wypas, który kryje się gdzieś tam – ukryty pod milionami opcji.

Przydatne linki:
Eclipse
Visual Express 2008

I co wy na to?