C产品如何满足特定用户需求?
- 内容介绍
- 文章标签
- 相关推荐
本文共计925个文字,预计阅读时间需要4分钟。
动态加载DLL在C++中的应用通常涉及以下步骤:
为什么 Assembly.LoadFrom 加载后根本 unload 不掉
Assembly.LoadFrom 把程序集扔进默认加载上下文(Default Load Context),而这个上下文在 .NET Framework 和 .NET Core 中都**不可卸载**。哪怕你把返回的 Assembly 变量设为 null、手动触发 GC.Collect(),它依然牢牢钉在内存里。
- 现象:多次调用
Assembly.LoadFrom("plugin.dll"),返回的是同一个实例(缓存行为),但你无法清理它 - 后果:插件热更新失败、内存持续增长、类型冲突(比如两个不同版本的
Newtonsoft.Json同时被拉进来) - 调试线索:用
fuslogvw.exe查 Fusion Log,看实际绑定到了哪个路径和版本
AssemblyLoadContext 是唯一可卸载的正解(.NET 5+)
只有显式创建 isCollectible: true 的 AssemblyLoadContext 实例,并全程在其内部完成加载、反射、调用,才能安全调用 Unload()。
本文共计925个文字,预计阅读时间需要4分钟。
动态加载DLL在C++中的应用通常涉及以下步骤:
为什么 Assembly.LoadFrom 加载后根本 unload 不掉
Assembly.LoadFrom 把程序集扔进默认加载上下文(Default Load Context),而这个上下文在 .NET Framework 和 .NET Core 中都**不可卸载**。哪怕你把返回的 Assembly 变量设为 null、手动触发 GC.Collect(),它依然牢牢钉在内存里。
- 现象:多次调用
Assembly.LoadFrom("plugin.dll"),返回的是同一个实例(缓存行为),但你无法清理它 - 后果:插件热更新失败、内存持续增长、类型冲突(比如两个不同版本的
Newtonsoft.Json同时被拉进来) - 调试线索:用
fuslogvw.exe查 Fusion Log,看实际绑定到了哪个路径和版本
AssemblyLoadContext 是唯一可卸载的正解(.NET 5+)
只有显式创建 isCollectible: true 的 AssemblyLoadContext 实例,并全程在其内部完成加载、反射、调用,才能安全调用 Unload()。

