执行天蓝色功能后卸载程序集

Posted

技术标签:

【中文标题】执行天蓝色功能后卸载程序集【英文标题】:Unload assemblies after azure function is executed 【发布时间】:2022-01-22 03:07:21 【问题描述】:

我有一个 azure 函数,它执行对服务器 (.net 6) 的 grpc 调用。在函数内部,我动态加载了一个程序集(动态生成),不幸的是,由于第 3 方库中的泄漏,该程序集在函数完成后没有被卸载。 我可以在执行后以某种方式终止函数进程吗?.. 所以下次我执行函数时,我可以再次加载正确的程序集?

【问题讨论】:

您无法控制 Azure 如何处理 next 函数的执行,它是在同一主机还是在进程空间中,所以您不应该理想情况下是实现这种行为 - 再次加载相同程序集的任何一种方式都不会引发任何错误,您是否面临这个问题? 我们正在开发一个测试应用程序。我们根据用户选择动态生成客户端代码,并从生成的代码中执行方法。所以程序集被生成,动态加载,然后我们从程序集中执行方法。我们面临的问题是我们不能总是卸载程序集以加载另一个生成的程序集。我正在考虑其他策略...如何确保我可以杀死整个过程? 在这种情况下,如果动态命名程序集,那么强行杀死整个进程以加载下一个生成的程序集是没有问题的。 是的,但是旧程序集不会一直加载在内存中,并且在执行 100 次后我没有可用内存? 如果您不是从 zip 包部署,那么您可以使用 host.json 中的 watchDirectories 设置来触发函数应用的重启。这在SO answer 中也有建议,试试它是否适合你。 【参考方案1】:

您可以简单地重新启动 Function App 站点,这将通过以下操作终止所有功能:

应用设置 -> 转到应用服务设置 -> 重启。

如果您正在使用动态计划,请确保升级或持续更新最新版本的运行时,因为有超时功能,它会阻止我们的功能无限运行。

【讨论】:

以上是关于执行天蓝色功能后卸载程序集的主要内容,如果未能解决你的问题,请参考以下文章

C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载

C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载

C#动态加载dll 时程序集的卸载问题

在 Unity 上安装 Firebase 时出现错误“正在卸载损坏的程序集”

ReflectionOnlyLoadFrom 和卸载?

C# 动态加载/卸载程序集