为什么AppDomain.CurrentDomain.GetAssemblies()在某些条件下不返回Global.asax中的依赖程序集?

编辑 :此前称为“IIS重新启动和应用程序初始化之间的应用程序初始化行为”。 我已经更改了标题,以便从IIS /应用程序初始化中扩展问题,因为观察到的行为与AppDomain.CurrentDomain.GetAssemblies();

我正在使用IIS应用程序初始化模块来预热asmx wed服务。

我已经实现了一些预热代码,以确保应用程序应用程序初始化成功JIT是我在Global.asax Application_Start事件中的asmx服务。 这使用System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod()来遍历应用程序中的所有程序集(它还会获取所有程序集依赖项),以确保第一次调用服务的速度尽可能快。

当我使用“net stop w3svc&net start w3svc”来观察这种行为时,我可以看到(通过记录)所有程序集都是JIT,并且第一次调用服务的速度很快。

但是,当应用程序池在其配置的时间表(03:00:00)上自动回收时,日志仅显示直接引用的程序集是JIT,而不是也位于文件夹中的依赖项。

这导致第一次调用服务时产生不可接受的开销。

App Init在所有其他方面完全按预期执行,但为什么IIS重新循环应用程序池只有JIT编译直接引用的程序集而不是它的依赖项?

我在上面的评论中提到的post让我朝着正确的方向前进,然后我在这篇文章中找到了答案: AppDomain.GetAssemblies和BuildManager.GetReferencedAssemblies之间的区别

所以我的代码改为var assemblies = BuildManager.GetReferencedAssemblies();