C# TypeBuilder.CreateType在什么情况下调用AppDomain.OnTypeResolveEvent?

C# TypeBuilder.CreateType在什么情况下调用AppDomain.OnTypeResolveEvent?,c#,reflection.emit,C#,Reflection.emit,根据: 如果封闭类型包含定义为嵌套类型的值类型字段(例如,定义为嵌套类型的枚举字段),则对封闭类型调用CreateType方法将生成AppDomain.TypeResolve事件 我试图调试一个编译器,该编译器在完全不同(并且完全没有文档记录!)的情况下引发此事件:我有一个接口(不能包含字段或嵌套类型),接口上的一个方法有一个泛型参数,该参数上有一个特定的类型约束TypeResolve正在询问该约束的类型 调试器说调用堆栈如下所示: System.AppDomain.OnTypeResolveE

根据:

如果封闭类型包含定义为嵌套类型的值类型字段(例如,定义为嵌套类型的枚举字段),则对封闭类型调用CreateType方法将生成AppDomain.TypeResolve事件

我试图调试一个编译器,该编译器在完全不同(并且完全没有文档记录!)的情况下引发此事件:我有一个接口(不能包含字段或嵌套类型),接口上的一个方法有一个泛型参数,该参数上有一个特定的类型约束
TypeResolve
正在询问该约束的类型

调试器说调用堆栈如下所示:

System.AppDomain.OnTypeResolveEvent
System.Reflection.Emit.TypeBuilder.CreateTypeNoLock
System.Reflection.Emit.TypeBuilder.CreateType
My.Compiler.TypeCreator.HandleTypeCreation
mscorlib.dll!System.AppDomain.OnTypeResolveEvent(System.Reflection.RuntimeAssembly assembly, string typeName)
[Native to Managed Transition]  
[Managed to Native Transition]  
mscorlib.dll!System.RuntimeTypeHandle.GetTypeByName(string name, bool throwOnError, bool ignoreCase, bool reflectionOnly, ref System.Threading.StackCrawlMark stackMark, System.IntPtr pPrivHostBinder, bool loadTypeFromPartialName)
mscorlib.dll!System.RuntimeType.GetType(string typeName, bool throwOnError, bool ignoreCase, bool reflectionOnly, ref System.Threading.StackCrawlMark stackMark)
mscorlib.dll!System.Type.GetType(string typeName, bool throwOnError)
ResolveTest.exe!Test.Main()
但是调试器对
TypeBuilder.CreateTypeNoLock的反编译既不显示调用发生的位置。事实上,在参考源文件中搜索“TypeResolve”根本不会产生任何结果,这意味着某种“神奇”正在发生

在哪里可以找到引发此
TypeResolve
事件的实际逻辑,以便修复编译器实现以处理它?

请查看文档中的。 在评论中指出:

当公共语言运行库无法确定可创建请求类型的程序集时,将发生TypeResolve事件

关于这一评论:

//此方法由VM调用

当您使用msdn条目中的示例并在
OnTypeResolveEvent
方法上放置断点时,您将得到如下stacktrace:

System.AppDomain.OnTypeResolveEvent
System.Reflection.Emit.TypeBuilder.CreateTypeNoLock
System.Reflection.Emit.TypeBuilder.CreateType
My.Compiler.TypeCreator.HandleTypeCreation
mscorlib.dll!System.AppDomain.OnTypeResolveEvent(System.Reflection.RuntimeAssembly assembly, string typeName)
[Native to Managed Transition]  
[Managed to Native Transition]  
mscorlib.dll!System.RuntimeTypeHandle.GetTypeByName(string name, bool throwOnError, bool ignoreCase, bool reflectionOnly, ref System.Threading.StackCrawlMark stackMark, System.IntPtr pPrivHostBinder, bool loadTypeFromPartialName)
mscorlib.dll!System.RuntimeType.GetType(string typeName, bool throwOnError, bool ignoreCase, bool reflectionOnly, ref System.Threading.StackCrawlMark stackMark)
mscorlib.dll!System.Type.GetType(string typeName, bool throwOnError)
ResolveTest.exe!Test.Main()
所以我认为很明显,这个事件将由运行时本身调用,而不是由框架库中的某个特定函数调用


要处理这种情况,将您自己的委托放在
AppDomain.TypeResolve
事件上,并通过提供缺少的类型来帮助运行时就足够了。

在这种情况下,我为
TypeResolve
grep coreclr或SSCLI代码。我很惊讶你的SSCLI搜索结果一无所获。我的coreclr搜索失败。您使用的是什么类型的类型约束?用于它的类型是否已创建?在我看来,当您没有按照依赖顺序创建类型时,运行时必须引发此事件。解压的CreateTypeNoLock代码显示,它在所有通用参数类型上调用CreateType。