99 lines
3.1 KiB
Markdown
99 lines
3.1 KiB
Markdown
# 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)
|