2012-10-01 21 views
5

Chciałbym zrozumieć, jak wszechobecne może być podciąganie JIT.Czy JIT może wstawiać mój kod do kodu zestawu środowiska wykonawczego .NET?

Załóżmy, że w moim kodzie wywołuję jakąś funkcję z zestawu powiedzmy System.IO i przekazuję odwołanie zwrotne do funkcji zaimplementowanej w moim kodzie do wywołania z wewnątrz tej funkcji System.IO. W mojej funkcji jest wywołanie GetCallingAssembly(). Więc jeśli mój callback zostanie zainicjowany w System.IO, to połączenie z GetCallingAssembly(), które pierwotnie znajdowało się w moim kodzie i miało na celu powiedzenie, że "aktualna" metoda jest wywoływana z poziomu System.IO, powie, że teraz jest wywoływane z mojego kodu.

Czy istnieje możliwość takiego wbudowania lub czy zestawy wykonawcze środowiska .NET są traktowane inaczej, tak aby JIT, wprowadzając kod użytkownika do kodu środowiska wykonawczego .NET był niedozwolony?

+1

W jaki sposób delegata oddzwaniacza kiedykolwiek zostanie zaindeksowany przez wywołującego wywołanie zwrotne? Nie jestem pewien, czy to ma sens ...? Rozumiem, że wbudowywanie ogranicza się do scenariuszy, w których kod do wywołania jest ** możliwy do sprawdzenia ** - to jest połączenie statyczne lub połączenie wirtualne z metodą inną niż wirtualna. –

+0

@ Mark Gravel: Dlaczego nie mógłbym tego zrobić, gdyby wiedział, że jest to jedyne wywołanie wywoływacza wywołania zwrotnego w całym programie? – sharptooth

+0

Podejrzewam, * że jest więcej wysiłku, aby zrozumieć, niż JIT kiedykolwiek zrobi, zwłaszcza, że ​​istnieje odbicie/meta-programowanie (co oznacza, że ​​nowi rozmówcy mogą istnieć później). –

Odpowiedz

3

Możesz spokojnie założyć, że oddzwanianie nie będzie inline. Zespoły .NET Framework są zawsze pre-jitted przez ngen.exe w czasie instalacji, nie ma opcji, aby później zmienić ten kod. Co więcej, wywołania zwrotne za pośrednictwem delegata nigdy nie są wstawiane, nawet jeśli optymalizator jittera mógłby wydedukować, jaka może być docelowa metoda delegata.

Powiązane problemy