2010-07-25 18 views

Odpowiedz

3

Jeśli inline IL (w tym samym duchu montażu inline obsługiwanym przez C i C++ kompilatory) jest to, czego szukasz, to może osiągnąć przy użyciu kompilacji po kompilacji w obie strony.

Mike Stall po raz napisany a tool for that, o ile wiem, jest to dość dojrzały:

Poza tym, można użyć F #, który wspiera Inline IL.

2

Potrzebne narzędzie nazywa się Cecil i jest częścią projektu Mono.

można uzyskać więcej informacji o tym tutaj: http://www.mono-project.com/Cecil

Cytat ze strony internetowej powyżej:

Cecil jest biblioteką napisany przez JB Evain (http://evain.net/blog/), aby wygenerować i sprawdzić programów i bibliotek w Format ECMA CIL. Ma pełną obsługę generycznych i obsługuje niektóre formaty symboli debugowania.

W języku angielskim z Cecilem można załadować istniejące zarządzane złożenia, przeglądać wszystkie zawarte typy, modyfikować je w locie i zapisywać z powrotem na dysku zmodyfikowany zespół.

2

DynamicMethod to lekki sposób na osiągnięcie tego w czasie wykonywania.

Kompilator Microsoft C# nie obsługuje wtrysku IL podczas kompilacji, ale narzędzie do tkania kodu może to zrobić jako krok po kompilacji.

9

Po prostu posted a utility, która pozwala na automatyczną zamianę całych ciał funkcyjnych C# na inline IL, używając niestandardowego atrybutu. Podobnie jak w przypadku podobnych narzędzi, działa to poprzez obieg ILDASM/ILASM, który można skonfigurować jako etap końcowy. Narzędzie dostosowuje również PDB w celu zachowania pojedynczego kroku i ustawiania punktów przerwania na poszczególnych instrukcjach IL w debugerze. To różni się od niektórych innych round-trip wkłady elastyczne IL tym, że (tylko) substytuty całych ciał funkcyjnych, na przykład:

class MyClass 
    { 
     [ILFunc(@" 
    .locals init ([0] int32 i_arg) 
     ldc.i4.3 
     ret 
    ")] 
     int MyFunc(int i_arg) 
     { 
      return 3; 
     } 
    }; 

Dla metod wysoce wydajności krytycznych, Próbowałem za pomocą DynamicMethod poprawy na compiler- wygenerował IL, ale okazało się, że utrata korzyści spowodowana jest obciążeniem delegatów. Inline IL daje korzyść ręcznie dostrojonej IL bez tego trafienia, zakładając, że nie ma żadnych dostosowań środowiska wykonawczego, których naprawdę potrzebujesz DynamicMethod dla.

Kompletny kod źródłowy znajduje się na http://www.glennslayden.com/code/c-sharp/inline-il

+0

nie znaleźliśmy żadnych atrybut ILFunc w swoim lib. – Denis

+0

@Denis Nie sądzę, że dostarczałem lib. Jest to kod źródłowy, a na stronie znajdują się dwa pliki. Druga (przewiń w dół poza tekst dodatkowy) zawiera definicję samego "atrybutu" ILFunc. –

+0

Poważnie genialny! Dzięki! – Thought