Files
XCEngine/docs/api/XCEngine/Editor/Application/RebuildScriptingAssemblies.md

99 lines
3.1 KiB
Markdown
Raw Normal View History

# Application::RebuildScriptingAssemblies
重建当前项目的 managed 脚本程序集,并在构建成功后立即重载脚本运行时。
```cpp
bool RebuildScriptingAssemblies();
```
## 前置条件
- `Application` 已经持有有效 `EditorContext`
- 当前项目路径非空
如果这两个条件不满足,当前实现直接返回 `false`
## 当前行为
当前实现的顺序是:
1. 读取当前 project path
2. 在启用 Mono scripting 的构建里,先调用 `ShutdownScriptingRuntime()`
3. 调用 `EditorScriptAssemblyBuilder::RebuildProjectAssemblies(projectPath)`
4. 如果构建失败,写入 `m_scriptRuntimeStatus.statusMessage` 并返回 `false`
5. 如果构建成功,继续调用 [ReloadScriptingRuntime](ReloadScriptingRuntime.md)
这意味着它的真实语义是:
- 不是“只生成 dll”
- 而是“先卸载当前 runtime 释放程序集锁,再构建,最后尝试切换到新 runtime”
## 返回值语义
返回值并不只代表“编译是否成功”。
当前它表示的是:
- 构建成功,且随后 `ReloadScriptingRuntime()` 也成功时,返回 `true`
- 只要构建失败,或构建成功但 runtime 仍未成功装载,返回 `false`
这一点很关键。比如:
- `dotnet/csc` 构建成功了
- 但生成后的程序集初始化 Mono runtime 失败了
这种情况下该方法仍会返回 `false`
## 失败路径
### 构建失败
如果 `EditorScriptAssemblyBuilder::RebuildProjectAssemblies(...)` 返回失败:
- 会把构建器返回的 `message` 写入 `m_scriptRuntimeStatus.statusMessage`
- 会记录 scripting error 日志
- 不会调用 `ReloadScriptingRuntime()`
但这里要注意一个和旧文档不同的点:
- 进入构建前已经执行过 `ShutdownScriptingRuntime()`
- 因此失败后 editor 会处于“没有活动脚本 runtime只保留失败状态消息”的状态
- 它不会继续保留旧 runtime
### Mono 后端未启用
如果当前构建没有启用 `XCENGINE_ENABLE_MONO_SCRIPTING`
- 会写入“不包含 Mono scripting support”的状态消息
- 直接返回 `false`
## 与 `ReloadScriptingRuntime()` 的区别
- `ReloadScriptingRuntime()` 只重扫并装载当前 `Library/ScriptAssemblies`
- `RebuildScriptingAssemblies()` 会先卸载当前 runtime 以释放 `GameScripts.dll` 这类项目本地程序集的锁,再尝试重新生成这些程序集,最后进入 reload
所以当 UI 上出现:
- `Reload Scripts`
- `Rebuild Scripts`
它们并不是两个名字不同的同义按钮,而是两条不同的恢复链路。
## 当前调用方
当前这条 API 的直接上层主要是脚本相关 UI例如
- `ScriptComponentEditor`
- `ProjectCommands`
- `MainMenuActionRouter`
它们通常会在“当前没有成功加载脚本程序集,但后端可用”时开放这个入口。
## 相关文档
- [Application](Application.md)
- [ReloadScriptingRuntime](ReloadScriptingRuntime.md)
- [GetScriptRuntimeStatus](GetScriptRuntimeStatus.md)
- [EditorScriptAssemblyBuilder](../Scripting/EditorScriptAssemblyBuilder/EditorScriptAssemblyBuilder.md)
- [EditorScriptRuntimeStatus](../Scripting/EditorScriptRuntimeStatus/EditorScriptRuntimeStatus.md)