2009-09-05 5 views
15

Co jest lepsze pod względem możliwości, łatwości użycia, dokumentacji, przykładów, społeczności/wsparcia, integracji VS, znanych implementacji, długoterminowej żywotności i budować szybkość, aby zaimplementować niestandardowe ramy AOP?Mono Cecil vs. PostSharp Core vs. Microsoft CCI do implementacji ram AOP

Zacznę od tego, co wiem (mam tylko próbował PostSharp do tej pory):

  • Microsoft Common Compiler Instrastruture (CCI): Czytałem, że służy do FxCop , ILMerge, SpeC# i Umowy kodów. Wydaje się być bardzo niski poziom as it does not even take care of correcting offsets for branch codes that are borken when IL is modified with it.
  • PostSharp ma 5 lat, ma wiele możliwości dla AOP (np streszczenia pewne rzeczy trzeba by mieć do zrobić ręcznie z IL away), kod źródłowy dostępny, opracowany/obsługiwane przez tylko jednego człowieka ale jest on planuje podejmowania tej działalności gospodarczej, ma dokumentację, ale mogłoby być lepiej, buduje się około dwa razy tak długo, bardzo małe próbki, jak wstrzykiwać IL i wersja 2.0 zostanie wydany wkrótce który zapowiada się znacznie ulepszony.
  • Mono Cecil: napisany przez jednego faceta, część pakietu Mono i jest plug-in dla reflektor nazywa REFLEXIL który używa Mono Cecil.

Odpowiedz

6

Zarówno Microsoft.CCI, jak i Mono.Cecil są niskiego poziomu i nie sprawdzają poprawności wyprodukowanych złożeń. Potrzeba dużo czasu, aby znaleźć przyczynę problemu, jeśli wystąpił błąd w wygenerowanym kodzie lub strukturze zespołu.
Zalecam używanie PostSharp, jeśli jego funkcje wystarczą do wykonywania zadań.
W przeciwnym razie ... Mono.Cecil ma lepszy, bardziej zrozumiały i łatwy w użyciu model obiektowy. Miałem jednak brzydki błąd, gdy użyłem go w moim programie (odwołanie do niewłaściwej metody zostało zapisane w zespole, myślę, że był jakiś błąd z obsługą tokenów metadanych)
Microsoft.CCI ma brzydki, całkowicie przeprojektowany obiekt model w tym samym czasie pozbawiony wielu prostych cech; jest jednak bardziej dojrzały niż Mono.Cecil. W końcu porzuciłem Mono.Cecil i użyłem Microsoft.CCI dla mojego programu.

+0

Dziękujemy za podzielenie się wrażeniami! Myślę, że zawsze możesz użyć narzędzia PEVerify do sprawdzenia poprawności produkowanych złożeń. Korzystam teraz z PostSharp i mogłem zrobić z nim wszystko, co chciałem (i masz rację, znajdując przyczynę, może to być bardzo frustrujące ...). Co masz na myśli mówiąc bardziej dojrzałe? Mniej buggy? Czy istnieje szczególny powód, dla którego nie korzystasz z PostSharp? Z ciekawości, co robi twój program? –

+0

Mój program to fuzja/obkurczanie, więc PostSharp nie był dla mnie pomocą. I tak, znalazłem Microsoft.CCI mniej wadliwy, i obsługuje więcej funkcji CLI (mieszane złożeń, na przykład). Jednak model obiektowy jest naprawdę trudny w użyciu. Użyłem PEVerify do sprawdzenia wygenerowanych złożeń (i nie jestem pewien, czy mógłbym odnieść sukces bez niego :)) Jednak błędy często łamią proces generowania zespołu, a PEVerify jest w takich przypadkach bezużyteczne. – skevar7

4

Jak większość ram, które są już tam, chciałbym zaproponować wam, dotyczące wdrażania własnego ramy AOP: nie rób tego. Istnieje już kilka takich, w tym (wkrótce), obsługiwany komercyjnie PostSharp i CThru, platforma AOP obsługiwana przez Typemock.

Ale w każdym razie znalazłem Mono.Cecil bardzo łatwy w użyciu. Eliminuje potrzebę przyjemnego radzenia sobie z Reflection.Emit i ma wsparcie społeczności Mono.

Proponuję zapoznać się z LinFu - jest to zestaw bibliotek open-source, jednym z nich jest framework AOP wdrożony na szczycie Mono.Cecil. Jest ładny artykuł o LinFu AOP na CodeProject.

+0

Interesuje mnie tylko AOP, który wstrzykuje kod podczas kompilacji. –

+0

LinFu to robi. Ma zadanie post-kompilatora do tkania IL. –

+1

Podczas gdy LinFu.AOP tka IL, który modyfikuje typy, aby umożliwić wstrzyknięcie kodu przy zadaniu post-kompilatora, rzeczywisty kod jest wstrzykiwany podczas działania, co jest mniej wydajne. –

3

AFAIK, LinFu jest zbudowany na Mono.Cecil.

Powiedziałbym, że PostSharp.Rdzeń ma więcej funkcji wysokiego poziomu niż inne frameworki, więc jest mniej łatwy w użyciu dla większych prac. Możesz pracować również na niskim poziomie, ale nie na poziomie binarnym (według projektu). Możesz użyć fuzji/obkurczania złożenia przy użyciu PostSharp, ale fakt, że kompiluje się z powrotem przy użyciu ILASM ustawiłby pewne ograniczenia (na przykład, że powinni być nazwani nawet członkowie wewnętrzni). Z drugiej strony, posiadanie ILASM jako zaplecza znacznie ułatwia rozwijanie się na szczycie PostSharp, ponieważ ILASM sprawdza wiele zasad i można łatwo odczytać wygenerowany kod MSIL. PostSharp pozwala nawet umieszczać komentarze w MSIL, aby pomóc w debugowaniu generowania kodu.

Kolejny punkt: jeśli chcesz wykonać niestandardowy aspekt (na przykład opracujesz silnik bazy danych i chcesz dostarczyć aspekt utrwalania), potrzebujesz znacznie więcej niż tylko przeszukiwarki MSIL. Potrzebujesz infrastruktury AO, która wykona za ciebie dużą część pracy. Kiedy opracowujesz niestandardowy aspekt, powiedziałbym, że 1% pracy jest specyficzny dla twojego niestandardowego aspektu, 39% to infrastruktura aspektu, a 60% to rzeczy przepisujące MSIL. Często jestem w stanie zaprogramować bardzo konkretny aspekt w ciągu kilku godzin w oparciu o PostSharp.

Wracając do twojego pytania i oczywiście z własnymi uprzedzeniami, powiedziałbym: jeśli chcesz napisać obfuscator, frazę/shrinker itd., Idź do Mono.Cecil lub Microsoft.CCI, aby uzyskać tylko dlatego, że ich licencja jest bardziej przyjazna niż ta na PostSharp. Ale jeśli chcesz rozwinąć niestandardowy aspekt, używanie PostSharp pozwoli Ci zaoszczędzić tygodni, a będziesz zaskoczony warunkami komercyjnymi, które moglibyśmy zaoferować, jeśli planujesz redystrybuować PostSharp.

+0

Brzmi nieźle. Sądzę, że będę trzymać się PostSharpu, odkąd do tej pory byłem z tego zadowolony. –

Powiązane problemy