2010-07-07 6 views

Odpowiedz

8

Uzyskanie definicji modułu dla mscorlib jest dość łatwe. Oto prosty sposób:

ModuleDefinition corlib = ModuleDefinition.ReadModule (typeof (object).Module.FullyQualifiedName); 

Ale jeśli wstrzyknąć kod, który jest wywołanie metody w mscorlib, nie koniecznie trzeba załadować moduł siebie. Na przykład:

MethodDefinition method = ...; 
ILProcessor il = method.Body.GetILProcessor(); 

Instruction call_writeline = il.Create (
    OpCodes.Call, 
    method.Module.Import (typeof (Console).GetMethod ("WriteLine", Type.EmptyTypes))); 

Tworzy instrukcję wywołania Console.WriteLine();

Jeśli chodzi o dokumentację, przeczytaj stronę importing na wiki.

+2

Ekscelencjo, dzięki! Nie zdawałem sobie sprawy, że możesz również używać obiektów odbicia .NET. Dokumentacja Cecila jest dość trudna do zdobycia:/ – thecoop

+1

Należy pamiętać, że ten kod zaimportuje metodę z pliku mscorlib dla wersji .NET zespołu wykonującego. Jeśli więc otworzysz zestaw .NET 2.0 i zmodyfikujesz go, uruchamiając powyższy kod w .NET 4.0, zmodyfikowany zestaw będzie zawierał odniesienia do 2.0 i 4.0 mscorlib, co prawdopodobnie nie jest zamierzone. –