Operational companion to docs/core-reload-architecture.md and domain/core-reload-boundary.md.
[!IMPORTANT] OPT-IN, NOT main 架構。 main 維持憲法的「單一
MCP/RevitMCP.csproj」結構,不含MCP.Contracts/MCP.CoreRuntime子專案。本 skill 的步驟只在 opt-in 熱重載分支(feature/core-reload-optin)上成立。在 main(單一 csproj)執行dotnet build MCP.CoreRuntime/...會找不到專案 —— 此時請改用/build-revit+/deploy-addon,並向使用者說明熱重載屬 opt-in 進階分支。知識來源:收編自 ChimingLu(啟銘)的熱重載分支(issue #33 決策:核心架構 opt-in、文件與邊界收編進 main)。
Pre-flight(先確認,否則停下)
- 確認目前分支具備 Loader/Core 分層:存在
MCP.CoreRuntime/MCP.CoreRuntime.csproj與MCP.Contracts/。- 不存在 → 回報「此分支非熱重載分支,改用
/build-revit+/deploy-addon」並停止。
- 不存在 → 回報「此分支非熱重載分支,改用
- 確認 Revit 正在執行、且 MCP 服務曾啟動過(Loader 已載入)。
- 確認目標版本(R22–R26)對應的 Addins 目錄存在。
熱重載迭代(不重啟 Revit,約 10–25 秒)
- 改 Core 邏輯(
MCP/Core/CommandExecutor.cs或MCP/Core/Commands/CommandExecutor.*.cs)。 - 重建 CoreRuntime(非 Loader):
dotnet build -c Release.R{YY} MCP.CoreRuntime/MCP.CoreRuntime.csproj --nologo - 部署:覆蓋
%APPDATA%\Autodesk\Revit\Addins\{year}\RevitMCP\runtime\RevitMCP.CoreRuntime.dll。- 務必確認
runtime\內沒有MCP.Contracts.dll(型別衝突來源,需刪除)。
- 務必確認
- 觸發重載:Revit ribbon「Core 重載」按鈕,或自動化
node MCP-Server/scripts/core-reload-verify.js --auto --revit {year}。 - 驗證:比對
create_dimension回傳的CoreVersionbefore/after 是否遞增。
重啟邊界(改到這些要重啟 Revit,不能熱重載)
依 domain/core-reload-boundary.md:
- Loader:
MCP/Application.cs、MCP/Commands/MCPCommands.cs MCP.Contracts介面簽章(IRevitMcpRuntime.cs)CoreRuntimeManager.cs/CoreLoadContext.cs.addinmanifest / AddInId / 載入路徑- 只改
MCP-Server/src/tools/*.ts→ 不需重啟 Revit,重啟 MCP Server 即可。
版本差異速記
| Revit | Runtime | 卸載機制 |
|---|---|---|
| 2025–2026 | .NET 8 | AssemblyLoadContext.Unload() + GC(真正卸載) |
| 2022–2024 | .NET FX 4.8 | Assembly.Load(byte[]) 記憶體載入(舊 Assembly 留存,>20 次/日重載記憶體緩增,建議每日首次重新部署) |
Error Handling
| 症狀 | 對策 |
|---|---|
找不到 MCP.CoreRuntime.csproj |
非熱重載分支 → 改用 /build-revit |
| 啟動錯誤「方法 'SetReloadCallback' 沒有實作」 | Loader/Contracts 已更新但 runtime DLL 是舊版 → 重建並部署 CoreRuntime;刪 runtime\MCP.Contracts.dll |
| 命令 8s timeout | UI 執行緒被 modal 阻塞 → 確認 SocketService.StartAsync() 無 modal TaskDialog(main 已收編此修正) |
CoreVersion 重載後沒變 |
runtime\ DLL 未更新或 shadow-copy 取到舊快照 → 確認部署時間戳;清 %TEMP%\RevitMCP\runtime-shadow\ |
| Port 8964 監聽=是但連線 timeout | HTTP.sys 孤兒 Queue → 重開機最可靠;或系統管理員 net stop http /y → net start http(勿改 port 8964) |