Skip to content

添加 MOD 管理器,支持运行时热启用和软停用 MOD,优化 MOD 列表刷新功能#549

Open
AlexBybye wants to merge 1 commit into
LorisYounger:mainfrom
AlexBybye:main
Open

添加 MOD 管理器,支持运行时热启用和软停用 MOD,优化 MOD 列表刷新功能#549
AlexBybye wants to merge 1 commit into
LorisYounger:mainfrom
AlexBybye:main

Conversation

@AlexBybye

Copy link
Copy Markdown

本次提交已经在我自己仓库另一个分支跑了github action,确认了编译无问题

image

此外,原有的设计异常捕捉、按钮防抖、异步缓存留存了,数据源统一成CoreMODs ,不再重复去解析 info.lps,且本地 mod 文件夹和 工坊MOD一起扫,不再像旧代码按需匹配,因为会发生列表和实际加载结果对不上的可能。

最重要的是需求本身:插件热插拔:

先把状态写到配置文件,把之前的"停用占位"删掉之后再重新构造 CoreMOD。
新加载的插件依次调 LoadPlugin() 和 GameLoaded()
异常处理是构造失败会自动回滚启用状态

发现无法做到热卸载,查询相关的文档:

https://learn.microsoft.com/zh-tw/dotnet/standard/assembly/unloadability

AI给出的解释为:Assembly.LoadFrom 加载的程序集进入不可卸载的默认加载上下文,且 MainPlugin 没有清理契约。因此「停用」是软停用——只摘除可控钩子(Plugins 列表、EndGame),DLL 本体会驻留到下次重启才真正不再加载,UI 已明确提示重启。若要实现真卸载,需改动 SDK(给 MainPlugin 增加 UnloadPlugin() 清理契约 + 切换为 collectible AssemblyLoadContext),且旧 MOD 无法受益

本次改动预期效果:

不用重启游戏就能启用、停用、发现 MOD 了,且坏 MOD 不会拖垮启动。
但 DLL 本体和动画缓存要等重启才能真正清干净,另外因为缓存是启动时生成的,动画/宠物模型可能仍需重启一次来增添或者解除效果

我认为可以开一个实验分支,然后在分支上检验下热启用、软停用、刷新显示MOD三个功能

@LorisYounger

Copy link
Copy Markdown
Owner

我讨厌纯AI编程就是因为AI会加一堆没有用的东西, 比如说那个防抖, 明明一个禁用UI即可, 增加太多复杂度

@AlexBybye

AlexBybye commented Jul 2, 2026 via email

Copy link
Copy Markdown
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants