# 项目私有 Jint 补丁 固定输入为 Jint 4.11.0 / `net10.0` 原始程序集 SHA256 `acf8a1a9f98aa771c95c2b15b9b58f21de8b77f027e2a8d5ca92597e87752d9d`。 工具只改项目私有 `obj` 副本,不修改全局 NuGet 包。 默认模式保留 V2 异常清理补丁:将可支持的 finally 清理镜像到 catch/rethrow,并保留正常 finally 路径和重复进入保护;未支持的嵌套异常形状在收据中明确列出。 `--bind-only` 为 Windows 宿主项目提供独立的可调用目标修复。原版本 `BindFunction` 自身实现 `ICallable`,却把其绑定目标强制转为 `Function`,导致再次绑定和绑定 Proxy 后调用失败。修复只将实际调用分派改为 `ICallable.Call`;`instanceof` 同样通过可表达这些对象的 `ObjectInstance` / `JsValue.OrdinaryHasInstance` 分派。原绑定参数、接收者、构造和异常路径保留。 原实现可查 [Jint 4.11.0 BindFunction.cs](https://github.com/sebastienros/jint/blob/v4.11.0/Jint/Native/Function/BindFunction.cs)。 根 `Directory.Build.targets` 导入 `HostJint.targets`,在每个实际宿主可执行文件或测试的复制阶段完成后,将该宿主的 Jint 复制到独立 `obj/XfeJintHost`、验证固定源哈希、校验并修正 IL,再复制回该项目自己的输出目录。`Jint.dll.XfeBind.json` 记录真正输出程序集的 SHA256。依赖编译引用不改,Interop 限制不放宽。 `--bind-and-cleanup` 用于 Cosmos 原生编译私有副本,先校验固定版本与方法形状,再应用原 V2 清理和相同的可调用目标修复。最终 `.XfeCleanup.json` 与 `.XfeBind.json` 都绑定实际最终 DLL 的 SHA256;前者增加 `BoundCallablePatchVersion: 1`。相同输入和有效收据可幂等重试,收据缺失、哈希改变、未标记非原始输入或非私有路径会被拒绝。 ```powershell dotnet test Tests/XFESystem.JintCleanupPatch.Tests/XFESystem.JintCleanupPatch.Tests.csproj -c Release --artifacts-path <独立绝对路径> ``` 测试包含原异常清理行为、实际加载宿主 DLL 标记与哈希、重复绑定、Proxy、接收者与参数、构造和 `instanceof`、名称和长度、非函数拒绝、原始包不变以及双补丁最终收据。 两个绑定模式还固定应用 `JintOwnedWeakCollectionsV1`:保留真实 `JsWeakMap` / `JsWeakSet` 的构造器、原型、参数验证和全部算法,仅把其私有 `ConditionalWeakTable` 存储及固定 11 / 4 处调用改为 `XFESystem.Collections.OwnedWeakTable`。原生运行时没有终结器,原 CWT 的移除、扩容和销毁不能及时释放依赖句柄。 每个 Engine 直接实现 `IWeakCollectionOwner`,独占一个 `WeakCollectionScope`。注册表只持有表的弱 GCHandle 和不含强键的依赖句柄存储,不强持有表或引擎;周期 Pump 清理死亡键和死亡表,页面退出明确释放全部弱句柄与依赖句柄,不依赖终结器。存活键的值反向引用表时,表的保持行为与实际 .NET 10 CWT 对照一致;无根的键/值循环仍可回收。释放之后存取明确拒绝,不能重新创建未注册句柄。 收据包含 `WeakCollectionsPatchVersion: 1` 并绑定最终 DLL;幂等调用重新验证 helper 程序集版本、Engine 所有权接口、私有字段和调用点完整性。全局 NuGet 包和原始网站、Monaco JavaScript 均不改。 `JintOwnedEngineWeakCollectionsV1` 将实际 Monaco 使用的 `Engine._emptyShapes` 与 JavaScript 私有类成员 `_privateElementStore` 也纳入同一个显式作用域。两个缓存仍按原位置惰性创建;原 `GetValue` 回调委托保留,空回调先验证,工厂重入添加的既存值优先,空值与工厂异常语义均有原 CWT 对照。私有成员字典通过精确的无参数构造工厂创建,不使用反射或 `Activator`。唯一主 Engine 构造器在基类构造之后增加 catch/rethrow;失败时只释放已经存在的作用域,原异常实例继续传出。其余四个构造器仍转发到该主构造器。 新增收据 `EngineWeakCollectionsPatchVersion: 1`,严格检查字段、固定 2 / 5 个调用、字典工厂及构造器异常区域;旧的已验证 Map/Set 补丁可以升级,部分补丁或收据不匹配则拒绝。原生公开自检还运行 128 个含私有字段、方法和访问器的对象、`Object.create` 原型身份、构造器形状缓存和配置回调抛错,要求释放前后的实际原生依赖槽数完全相等。该范围不包含没有在本轮路径证实的 Interop 缓存、WeakRef 或 FinalizationRegistry。