Wiele metod w bibliotece .Net jest zaimplementowanych w natywnym kodzie. Te, które pochodzą z samej struktury, są oznaczone jako [MethodImpl(MethodImplOptions.InternalCall)]
. Te, które pochodzą z niezarządzanej biblioteki DLL, są oznaczone jako [DllImport]
(np. [DllImport("kernel32.dll")]
). Do tej pory nic niezwykłego.Co to jest [DllImport ("QCall")]?
Podczas pisania answer for another question odkryłem, że istnieje wiele metod oznaczonych jako [DllImport("QCall")]
. Wydają się być wewnętrzną implementacją .Net (np. GC._Collect()
).
Moje pytanie brzmi: co dokładnie oznacza [DllImport("QCall")]
? Jaka jest różnica między [DllImport("QCall")]
i [MethodImpl(MethodImplOptions.InternalCall)]
?
To specjalne połączenie wewnętrzne; Próbuję znaleźć szczegóły. – SLaks
Pamiętam, że od dawna czytam, że "QCall" jest częścią clr.dll. Ja jednak nie wiem zbyt wiele poza tym. +1 za doskonałe pytanie. – ahawker
Jest to specyficzna funkcja .NET 4. Możesz uzyskać odrobinę wglądu ze źródła referencyjnego V4, spójrz na kod źródłowy dla System.Runtime.CompilerServices.Jithelpers.cs. Łańcuch pojawia się dwa razy w clr.dll, jako __IsQCall i jako inline literal. To bardzo przypomina mechanizm rozszerzenia poza MethodImplOptions.InternalCall, dowodząc, że jest to trudne bez kodu źródłowego CLR. –