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

99 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)