2010-02-16 8 views
7

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

3

Prawdopodobnie tak. To zależy.

Mono Projekt ma biblioteki o nazwie Cecil, którą można otworzyć tutaj:

http://mono-project.com/Cecil

jednak jest zarządzany kod, który nie można wywołać podczas profilowania. Możesz jednak wybrać kilka opcji:

  1. 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.
  2. Port CECIL do C++. Kod jest rozpowszechniany na licencji MIT/X11, więc możesz to zrobić bez konieczności udostępniania swoich zmian.
  3. 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.

+0

Używam już Cecila i szukam niezarządzanej alternatywy. – plaureano

+0

Chodzi mi o to, że nie sądzę, że istnieje taki, który istnieje. –

+0

Kiedy powiedziałem "prawdopodobnie", odpowiadałem na pytanie "czy muszę napisać własne ...". –

-1

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.

0

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.

Powiązane problemy