Nach the documentation of System.Reflection.Emit.TypeBuilder.CreateType
:Unter welchen Umständen ruft TypeBuilder.CreateType AppDomain.OnTypeResolveEvent auf?
Wenn das einschließende Typ ein Feld enthält, das ein Werttyp als ein verschachtelter Typ definiert ist (beispielsweise ein Feld, das eine Aufzählung als ein verschachtelter Typ definiert ist), der Create Methode aufrufen Auf dem umschließenden Typ wird ein AppDomain.TypeResolve-Ereignis generiert.
Ich versuche, einen Compiler zu debuggen, der dieses Ereignis unter einem ganz anderen (und völlig ohne Papiere!) Raising Umstand: Ich habe eine Schnittstelle (die keine Felder oder verschachtelte Typen enthalten kann) und eine der Methoden auf Die Schnittstelle hat einen generischen Parameter mit einer spezifischen Einschränkung. TypeResolve
fragt nach dem Typ dieser Einschränkung.
Der Debugger sagt der Call-Stack wie folgt aussieht:
System.AppDomain.OnTypeResolveEvent
System.Reflection.Emit.TypeBuilder.CreateTypeNoLock
System.Reflection.Emit.TypeBuilder.CreateType
My.Compiler.TypeCreator.HandleTypeCreation
aber weder der Debugger Dekompilierung TypeBuilder.CreateTypeNoLock
noch the reference source zeigt, wo dieser Anruf stattfindet. Die Suche in der Referenzquelldatei nach "TypeResolve" ergibt überhaupt nichts, was bedeutet, dass etwas "Magie" vor sich geht.
Wo kann ich herausfinden, was die tatsächliche Logik hier ist, die dieses TypeResolve
Ereignis auslöst, damit ich die Compiler-Implementierung beheben kann, um damit umzugehen?
In solchen Fällen grep ich die CoreCRR oder SSCLI-Code für 'TypeResolve'. Ich bin überrascht, dass Ihre SSCLI-Suche nichts ergab. Meine corecrr Suche hat es getan. – usr
Welche Art von Einschränkung verwenden Sie? Wurde der Typ, der dafür verwendet wird, bereits erstellt? Mir scheint, dass die Laufzeit dieses Ereignis auslösen muss, wenn Sie keine Typen in Abhängigkeitsreihenfolge erstellt haben. Der dekompilierte CreateTypeNoLock-Code zeigt, dass er CreateType für alle generischen Argumenttypen aufruft. – usr