Przeglądałem niektóre artykuły dotyczące interfejsu API CLR Profiling, a wiele z tych artykułów mówi o wywołaniu funkcji SetILFunctionBody(), aby wykonać przepisanie IL; jednak żaden z tych artykułów nie wyjaśnia dokładnie, czego można użyć do przepisania rzeczywistych bajtów IL metody. Czy istnieje niezarządzana biblioteka, która pozwala mi pisać IL, czy też sam bym ją napisał?Czy muszę napisać własną niezarządzaną bibliotekę IL, aby przepisać IL za pomocą interfejsu API CLR Profiling?
Odpowiedz
Prawdopodobnie tak. To zależy.
Mono Projekt ma biblioteki o nazwie Cecil, którą można otworzyć tutaj:
jednak jest zarządzany kod, który nie można wywołać podczas profilowania. Możesz jednak wybrać kilka opcji:
- Użyj IPC. Możesz utworzyć nowy proces, wykonując przepisywanie przy użyciu cecil w tym procesie, a następnie przekazać bajty do swojego profilera, używając nazwanych potoków.
- Port CECIL do C++. Kod jest rozpowszechniany na licencji MIT/X11, więc możesz to zrobić bez konieczności udostępniania swoich zmian.
- Wystarczy napisać własne rzeczy od podstaw.
# 1 wprowadza mnóstwo dodatkowej złożoności. Twój profiler miałby więcej ruchomych części, niż jest to naprawdę potrzebne. Ponadto, IPC wprowadza szereg dodatkowych kosztów.
# 2 zajęłoby dużo czasu. Biorąc pod uwagę, że Cecil wciąż jest tylko w wersji 0.6, może nie być wart czasu, aby to zrobić, zamiast pisania własnej implementacji.
# 3 zapewni Ci największą kontrolę i prawdopodobnie będzie najbardziej wydajną. Wymagałoby to jednak znacznie więcej wysiłku niż pierwsza.
Zakładam, że chcesz to zrobić, ponieważ chcesz zobaczyć, co zabiera trochę czasu, abyś mógł jechać szybciej (w przeciwieństwie do otrzymywania różnych informacji o czasie). IMHO, nie potrzebujesz interfejsu API do profilowania, jeśli możesz uruchomić aplikację pod IDE i wstrzymać ją losowo. Here's why.
Rzeczywiste bajty muszą pochodzić skądś i jeśli używasz właśnie Profiling API, musisz je podać samemu. W tym artykule szczegółowo opisano, jak to zrobić (prawdopodobnie jeden z tych, które przeczytałeś): http://msdn.microsoft.com/en-us/magazine/cc188743.aspx
Bardziej "powszechną" techniką jest pisanie dowolnego kodu w dowolnym języku, który preferujesz, a następnie skompilowanie go do IL. Następnie możesz wyodrębnić OpCodes w czasie projektowania i przechowywać je tam, gdzie możesz do nich dotrzeć lub wyodrębnić je ze skompilowanej biblioteki IL w czasie wykonywania i przesłać tam, gdzie jest to potrzebne.
AFAIK nie ma niezarządzanych bibliotek, które mogą ci w tym pomóc.
Ten artykuł może mieć co szukasz http://www.codeproject.com/KB/cs/IL_Rewriting.aspx
To nie jest zły artykuł rzeczywiście - ma swoje ograniczenia, jeśli chodzi o zastrzyku IL, ale wciąż tylko jeden z niewielu które obejmują temat –
Napisałem prosty jeden dla OpenCover https://github.com/sawilde/opencover który może Ty lub ktoś inny w tym zakresie znaleźć użyteczne
- 1. Jak się uczyć IL na CLR
- 2. Optymalizacja IL dla kompilatorów JIT
- 3. Jak napisać klasy C# z Reflection.Emit dynamicznie według IL
- 4. Czy Debug.Assert generuje IL w trybie zwolnienia?
- 5. emitujących IL wywołać funkcję Math
- 6. .Net Profiling API Approaches
- 7. Czy można pominąć sprawdzanie widoczności podczas generowania dynamicznego IL za pomocą metody MethodBuilder?
- 8. Czy il wyprodukowany przez kompilator C# 4.0 działa na CLR 2.0?
- 9. Czy .Net Core generuje taką samą IL jako standardową .Net?
- 10. Konwersja prostej klasy do IL nie powiodła się z powodu nieprawidłowego kodu IL?
- 11. Czy istnieje coś takiego jak komentarz w IL?
- 12. Obliczanie wartości maksymalnej w kodzie IL
- 13. Wygenerowane różnice IL dla VB.NET i C#
- 14. Rozmiar IL dla kodu Xamarin C#?
- 15. Narzędzie do łatwej inspekcji kodu IL
- 16. Jak działa dyrektywa .NET IL .maxstack?
- 17. Blok iteratora generuje błąd próbny w IL
- 18. Jak mapować natywny wskaźnik instrukcji IL w trakcie przetwarzania
- 19. oauth2orize za pomocą interfejsu API?
- 20. C# Metoda dynamiczna - IL vs drzewa wyrażeń
- 21. Jak napisać bibliotekę .so, aby zastąpić istniejącą bibliotekę C++ .so?
- 22. Czy mogę odtworzyć inżynierię własną bibliotekę dll?
- 23. Czy istnieje opis ikon dezasemblera IL dostępnych gdzieś w Internecie?
- 24. Czy .Net IL zmieniło się w ogóle od .Net 2.0?
- 25. Czy metoda nazywania właściwości getters/setters jest zestandaryzowana w IL?
- 26. Czy atrybut DllImport zawsze ładuje niezarządzaną bibliotekę DLL?
- 27. Czy mogę porównać kod IL, aby określić, która technika jest szybsza lub lepsza?
- 28. rozwiązaniu znaki występujące w IL z dynamicznego sposobu
- 29. Pobierz AST z zestawu .Net bez kodu źródłowego (kod IL)
- 30. Czy muszę kota, aby napisać heredoc do pliku?
Używam już Cecila i szukam niezarządzanej alternatywy. – plaureano
Chodzi mi o to, że nie sądzę, że istnieje taki, który istnieje. –
Kiedy powiedziałem "prawdopodobnie", odpowiadałem na pytanie "czy muszę napisać własne ...". –