We wtorek miałem przyjemność wygłosić prelekcję prelekcję na temat Mono.Cecil na Wrocławskiej Grupie .NET.

— Byłeś na tej prezentacji? – Oceń ją


W sesji starałem się zaprezentować czym jest Mono.Cecil oraz jakie daje nam możliwości jeśli chodzi o przeglądanie, modyfikację plików assembly. Mam nadzieję, że za pomocą przykładów: generatora statystyk, automatyczną implementację INotifyPropertyChnaged wraz z użyciem MSBuild task pokazałem jak możemy wykorzystać Mono.Cecil, aby ułatwić naszą pracę. Dodatkowo poprzez zaprezentowanie prostego AOP (logowanie WE/WY do metody) oraz napisanie prostego obfuskatora kodu mam nadzieję pokazałem jak możemy wykorzystać tę bibliotekę do ciekawych rozwiązań wzbogacając nasz kod.

Jak bawić się ze źródłami? Solucja podzielona jest na 5 folderów: AOP, INotifyPropertyChanged, MsBuild.Task, Obfuscate oraz Statistics.

Zabawę polecam od Statistics. Prosty projekt, który pokazuje jak można przejrzeć assembly i zliczyć wystąpienia typów, metod, właściwości itd.

Następnie można zapoznać się z INotifyPropertyChanged. Jest tam pokazane rozwiązanie naiwne z jawnym wołaniem OnNotifyPropertyChnaged w setterze oraz trochę ładniejsze z wykorzystaniem Expression. 3 przykład w tym projekcie wykorzystuje mono Cecil. Wystarczy do bindowania użyć właściwości Header3 i zbudować aplikacje. Następnie uruchomić Mono.Cecil.INotifyPropertyChanged a po jego zakończeniu uruchomić (nie z VS) projekt WPF.INotifyPropertyChanged. Binding powinien działać wyśmienicie. Po tym warto zagłębić się w kod źródłowy projektu, aby zobaczyć jak za pomocą Mono.Cecil możemy dodać niezbędny kod.

Jak już rozpracujemy ten przykład warto zerknąć do MSBuild.Task jest to ulepszenie poprzedniego tak aby cała “magia” Mono.Cecil działa się przy każdym budowaniu projektu w VS. Dzięki temu nie będziemy musieli odpalać zewnętrznych aplikacji.

Dalej warto zapoznać się z folderem AOP. Jest tam pokazane jak za pomocą Cecil wygenerować dodatkowe instrukcje logowania na konsole każdego WE/WY do/z metody wraz z aktualnym czasem. Jest to swojego rodzaju Aspect-Oriented Programming.

Na sam koniec polecam zerknąć na projekt Obfuscate. Pokazuję tam jak możemy choć trochę zaciemnić nasz kod i co niektóre łańcuchy znaków w nim występujące, aby nie były tak łatwo dostępne dla osoby przeglądającej zdekompilowany nasz kod.

Uwaga: Przykłady zawierają dość spore ilości ILa – Nie odpowiadam za uszkodzenia wynikające z nadmiernego napromieniowania się tymi niskopoziomowymi instrukcjami 🙂

Do przeglądania skompilowanych źródeł polecam IlSpy’a, dotPeek’a, JustDecompile’a czy Reflector’a (ehh wisi mi jeszcze post porównujący te narzędzia…)

Link do prezentacji i przykładów i slajdów znajduje się na stronie grupy na portalu Wss/Codeguru.

Mile widziane uwagi i sugestie – sam już widzę, że chyba warto też przygotować, choćby krótką prezentację pt. Wstęp do IL, bo część osób nie jest w temacie.