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

3.1 KiB
Raw Blame History

Application::RebuildScriptingAssemblies

重建当前项目的 managed 脚本程序集,并在构建成功后立即重载脚本运行时。

bool RebuildScriptingAssemblies();

前置条件

  • Application 已经持有有效 EditorContext
  • 当前项目路径非空

如果这两个条件不满足,当前实现直接返回 false

当前行为

当前实现的顺序是:

  1. 读取当前 project path
  2. 在启用 Mono scripting 的构建里,先调用 ShutdownScriptingRuntime()
  3. 调用 EditorScriptAssemblyBuilder::RebuildProjectAssemblies(projectPath)
  4. 如果构建失败,写入 m_scriptRuntimeStatus.statusMessage 并返回 false
  5. 如果构建成功,继续调用 ReloadScriptingRuntime

这意味着它的真实语义是:

  • 不是“只生成 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

它们通常会在“当前没有成功加载脚本程序集,但后端可用”时开放这个入口。

相关文档