2008-10-30 41 views
12

Wiem, że jest możliwe (teoretycznie), aby utworzyć nowy typ w czasie wykonywania, ale czy jest możliwe, aby zmodyfikować ciało metody istniejącego typu w czasie wykonywania? Mój plan (jeśli mogę to uruchomić) polega na oznaczeniu metod niestandardowym atrybutem, a następnie w czasie wykonywania w poszukiwaniu metod z atrybutem i wstawieniu części mojego własnego kodu do treści metody.Czy można zmodyfikować treść metody w czasie wykonywania w .NET?

Wszelkie sugestie?

Przypuszczam, że jeśli nie uda mi się uzyskać takiego podejścia do pracy, zawsze mógłbym użyć metody wirtualnej w klasie bazowej (z atrybutami), w połączeniu z fabryką statyczną, aby wypluć pochodną typ dynamiczny z moim przebiegiem Metoda generowana w czasie w klasie potomnej. Nie byłby jednak tak czysty w użyciu.

Odpowiedz

9

PostSharp który jest aftercompiler, robi coś podobnego do tego, co można opisać za pomocą atrybutów, aby zaznaczyć punkty wstrzykiwań w kodzie , jedyna różnica polega na tym, że robi to podczas kompilacji.

Ale można to również zrobić w środowisku wykonawczym, nie zmieniając ciał metod, ale używając klas pochodnych od ContextBoundObject, która jest klasą .Net, która pozwala przechwytywać wszystkie wywołania skierowane przeciwko niemu. Oto MSDN Magazine article opisujący, jak wykonać AOP za pomocą ContextBoundObject. (Sprawdź aspekty w .NET część artykułu)

a jako trzeci opcją dynamicznego generowania kodu (Reflection.Emit lub CodeDom) można używać w połączeniu z atrybutów i metod wirtualnych, gdzie dynamicznie generować klas pochodnych cię można wstawić kod, ale jest to najbardziej bolesny sposób na zrobienie tego.

Edit:

Istnieje dalej możliwość korzystania .Net unmanaged profiling API przechwycić metody JIT-ing i zastąpić metodę ciał przed JIT-ing. Ta technika jest z powodzeniem stosowana przez JustMock (Telerik) w celu udawania, metod statycznych, metod nie-wirtualnych, a nawet zapieczętowanych klas.

0

Czy planujesz zrobić to dla dowolnych typów? Przypuszczam, że nie biorąc pod uwagę, że zamierzasz udekorować metody za pomocą atrybutu.

Biorąc to pod uwagę, myślę, że lepszym podejściem byłoby zdefiniowanie abstrakcyjnych metod w super klasie dla twoich typów. Metoda w klasie super może zawierać kod metody płyty kotła i delegować do konkretnych implementacji za pomocą metod abstrakcyjnych dla zachowania tego typu poszczególnych typów.

Generalnie rzecz biorąc, jeśli nie możesz tworzyć plików kodu i kompilować dynamicznych złożeń w środowisku wykonawczym, nie można zrobić tego, co chcesz zrobić. Prawdopodobnie istnieje dużo więcej praktycznych zasad i wzorców OO, które można wykorzystać do osiągnięcia zbliżonych rezultatów.

3

Nie można modyfikować istniejącej metody w środowisku wykonawczym, ale można ją utworzyć przy użyciu kodu DOM w locie i wykonać to. Można też połączyć razem ciągi kodu i skompilować je w pamięci i uruchomić.

Sam zrobiłem to drugie (aplikacja, na której zezwoliłem na niestandardowy kod C#, który został skompilowany i wykonany w pamięci, w środowisku uruchomieniowym).

Powiązane problemy