Wenn man sich ansieht, wann die Methoden JIT kompiliert mit WinDbg/SOS bekommen, zeigt sich, dass statische Methoden nicht kompiliert werden, bevor sie aufgerufen werden.
Betrachten Sie die folgende Klasse:
class SomeType
{
[MethodImpl(MethodImplOptions.NoInlining)]
public void InstanceMethod()
{
Console.WriteLine("instance");
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static void TypeMethod()
{
Console.WriteLine("type");
}
}
ich die NoInlining Option die Compiler von inlining diese Methoden in einem Release-Build zu verhindern.
Wenn ich eine kleine App wie unten ausführen und den WinDbg anhängen kann ich beobachten, wenn die Methoden JIT kompiliert bekommen.
var st = new SomeType();
Console.WriteLine("attach");
Console.ReadLine();
Console.WriteLine("calling methods");
st.InstanceMethod();
SomeType.TypeMethod();
Console.ReadLine();
An der Stelle des Verfahrens Tisch befestigen für SomeType
sieht wie folgt aus:
0:004> !dumpmt -md 0041387c
EEClass: 004114d4
Module: 00412e94
Name: ConsoleApplication2.SomeType
mdToken: 02000007
File: c:\temp\ConsoleApplication1\ConsoleApplication1\bin\Release\ConsoleApplication1.exe
BaseSize: 0xc
ComponentSize: 0x0
Slots in VTable: 7
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
Entry MethodDe JIT Name
6d374960 6d076728 PreJIT System.Object.ToString()
6d368790 6d076730 PreJIT System.Object.Equals(System.Object)
6d368360 6d076750 PreJIT System.Object.GetHashCode()
6d3616f0 6d076764 PreJIT System.Object.Finalize()
0041c035 00413874 NONE ConsoleApplication2.SomeType..ctor()
0041c02d 0041385c NONE ConsoleApplication2.SomeType.InstanceMethod()
0041c031 00413868 NONE ConsoleApplication2.SomeType.TypeMethod()
Nach den Methoden wurden aufgerufen explizit wie folgt aussieht:
0:007> !dumpmt -md 0041387c
EEClass: 004114d4
Module: 00412e94
Name: ConsoleApplication2.SomeType
mdToken: 02000007
File: c:\temp\ConsoleApplication1\ConsoleApplication1\bin\Release\ConsoleApplication1.exe
BaseSize: 0xc
ComponentSize: 0x0
Slots in VTable: 7
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
Entry MethodDe JIT Name
6d374960 6d076728 PreJIT System.Object.ToString()
6d368790 6d076730 PreJIT System.Object.Equals(System.Object)
6d368360 6d076750 PreJIT System.Object.GetHashCode()
6d3616f0 6d076764 PreJIT System.Object.Finalize()
0041c035 00413874 NONE ConsoleApplication2.SomeType..ctor()
004700e0 0041385c JIT ConsoleApplication2.SomeType.InstanceMethod()
00470110 00413868 JIT ConsoleApplication2.SomeType.TypeMethod()
D.h. Die Methoden werden erst dann JIT kompiliert, wenn sie tatsächlich aufgerufen werden.
(Für das Protokoll wurde dieser auf 4,5 .NET getan) Ich glaube, sie würde, sobald die _type_ geladen ersten jitted werden. Dies ist normalerweise der Fall, wenn die Baugruppe geladen wird. – Oded
Hat Ihr Kollege eine Referenz? Vielleicht erklärt es auch das Verhalten. Ansonsten fragst du jemanden, warum etwas passiert, das vielleicht gar nicht passiert. – millimoose