feat(security): 仅加载显式授权的外部 DLL
Publish UPM package / publish (push) Successful in 2s

This commit is contained in:
2026-08-28 03:44:10 +08:00
parent 39f6f97707
commit f6688ce573
13 changed files with 352 additions and 74 deletions
+27 -25
View File
@@ -7,7 +7,7 @@
- 依赖解析
- 生命周期阶段
- 内容注册表
- 自动启动
- 可选显式启动
- 外部 DLL 模组热加载
- Harmony 热补丁接入
- 网络同步通道
@@ -31,17 +31,19 @@
- 内置的资源包系统、命令系统、配方编辑器
- 内置的具体联网实现
## 自动启动
## 启动
现在默认**不需要**把 `ShrinkModBootstrap` 挂到场景里。
框架会通过
安全默认值不会自动启动或扫描外部 DLL。需要装载工程内模组时,可以显式调用
`ShrinkModLoader.LoadAll(settings)`;需要外部代码模组时,调用方必须先完成自己的清单、
启用状态和哈希校验,再提交精确白名单
```csharp
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
ShrinkModRuntimeBootstrap.InitializeDriver(settings);
ShrinkModLoader.LoadAuthorized(settings, authorizedDllPaths);
```
自动读取 `ShrinkModFrameworkSettings` 并调用装载流程。
只有显式打开 `autoLoadOnStartup` 时,`AfterAssembliesLoaded` 入口才会装载工程内模组;
该自动入口仍不加载任何未授权外部 DLL。
相关入口:
@@ -52,12 +54,14 @@
## 配置文件
创建 `ShrinkModFrameworkSettings` 资产后,框架会自动查找它。
菜单 `ShrinkSDK/模组/创建设置` 会在
`Assets/Resources/GameAssets/Runtime/Data/ShrinkSDK/ShrinkModFrameworkSettings.asset`
创建配置。运行时优先加载该路径,并保留旧根路径回退。
关键配置包括:
- `autoLoadOnStartup`
- 是否在启动时自动装载模组
- 是否在启动时自动装载工程内模组,默认关闭
- `useContextHost`
- 默认开启:把模组四阶段放进 `ShrinkModContextHost`,替换失败恢复旧组件源;关闭后回退旧 Loader
- `verboseLogging`
@@ -65,11 +69,11 @@
- `assemblyNamePrefixes`
- 只扫描指定前缀的程序集
- `enableExternalDllMods`
- 是否启用外部 DLL 模组
- 是否允许显式白名单中的外部 DLL 模组,默认关闭
- `externalModsFolderName`
- 外部模组目录名,默认 `Mods`
- `watchExternalModsDirectory`
- 是否自动监听目录变化并协调外部 DLL revision 变化
- 是否监听文件变化并重新提交既有白名单,默认关闭;监听不会扩大授权范围
- `externalModsReloadDelaySeconds`
- 文件变更后延迟多少秒再尝试热加载
- `externalAssemblyRevisionSoftLimit`
@@ -182,13 +186,8 @@ public class DemoSafeMod : ShrinkModBase
## 外部 DLL 模组热加载
框架会扫描:
`Application.persistentDataPath/<externalModsFolderName>`
默认就是:
`Application.persistentDataPath/Mods`
框架不会递归扫描模组目录。调用方必须把每个允许进入 AppDomain 的入口 DLL 绝对路径
作为白名单提交给 `LoadAuthorized`;目录中未列出的 DLL 不会被读取或加载。
ContextLoader 装载规则:
@@ -199,16 +198,19 @@ ContextLoader 装载规则:
- 不支持 IL2CPP Player 动态程序集加载
- 支持同目录依赖程序集解析
你可以在运行时调用
首次安全加载
```csharp
ShrinkModLoader.LoadNewExternalMods();
ShrinkModRuntimeBootstrap.InitializeDriver(settings);
ShrinkModLoader.LoadAuthorized(settings, authorizedDllPaths);
```
默认会扫描当前 DLL revision,并把新增、替换、删除映射为一个完整期望组合;
变更事务失败时保留旧模组组合。设置 `useContextHost = false` 才回退为仅新增 DLL 的旧路径。
后续可调用 `ShrinkModLoader.LoadNewExternalMods(settings)` 重新读取同一白名单的 revision,
把新增、替换、删除映射为完整期望组合;变更事务失败时保留旧模组组合。设置
`useContextHost = false` 时,旧路径同样只读取显式白名单,但仍保持只增不减的兼容语义。
如果 `watchExternalModsDirectory = true`,框架会监听新增、修改、删除、重命名事件,经过主线程 debouncer 后提交一次完整组合;同一 burst 内的中间坏文件不会覆盖当前有效 revision。
如果 `watchExternalModsDirectory = true`,框架会监听目录变化并在主线程 debouncer 后重新提交
既有白名单;未授权文件即使触发通知也不会被加载。同一 burst 内的中间坏文件不会覆盖当前有效 revision。
### 常驻 revision 诊断
@@ -697,8 +699,8 @@ public sealed partial class DemoFullMod : ShrinkModBase
现在这套框架已经从“只能在工程内静态发现模组”的骨架,升级成了:
- 自动启动
- 可增量接入外部 DLL
- 可显式托管启动
-按精确白名单增量接入外部 DLL
- 可选 Harmony 补丁
- 可扩展的网络同步框架