为啥 AppDomain.CurrentDomain.GetAssemblies() 在某些情况下不返回 Global.asax 中的依赖程序集?

Posted

技术标签:

【中文标题】为啥 AppDomain.CurrentDomain.GetAssemblies() 在某些情况下不返回 Global.asax 中的依赖程序集?【英文标题】:Why does AppDomain.CurrentDomain.GetAssemblies() not return dependant assemblies in Global.asax under certain conditions?为什么 AppDomain.CurrentDomain.GetAssemblies() 在某些情况下不返回 Global.asax 中的依赖程序集? 【发布时间】:2013-09-06 11:32:03 【问题描述】:

编辑:之前的标题是“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 编译直接引用的程序集而不是其依赖项?

【问题讨论】:

这篇文章似乎是指同一个问题:***.com/questions/3552223/… 【参考方案1】:

好吧,我上面评论中提到的帖子引导我朝着正确的方向前进,然后我在这篇帖子中找到了答案:Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies

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

【讨论】:

还发现了这个有用的问题,来自@Tseng 的 cmets,与 .Net Core ***.com/questions/51818374/…987654322@

以上是关于为啥 AppDomain.CurrentDomain.GetAssemblies() 在某些情况下不返回 Global.asax 中的依赖程序集?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?