跳到主要内容
文档站副本

本页为语义契约的发布副本;请在上游 ZenTSTest/Docs/spec 修改后执行 npm run sync-spec。(源:marshal\10-POINTER.md)

指针与不支持类型

规范性: 非托管指针、函数指针、以及 v1 默认不支持或受限的 CLR 形态之 Marshal 规则。 相关: 默认矩阵 → 01-OVERVIEW.md;IntPtr → 01-OVERVIEW.md §4;OpaqueValue → 04-OPAQUE.md;Delegate → 09-FUNCTION.md;ref struct → 05-STRUCT.md。

平台原则: Mono 与 Il2Cpp JS 可见语义一致。


1. 与 IntPtr / UIntPtr 的区分​

类型JS 默认形态脚本可当作整数运算
IntPtr / UIntPtr / nint / nuintnumber(整数)可以(按数值;禁止 bigint)
T* / void* 等非托管指针Pointer(internal opaque handle)不可以(仅透传)
函数指针 delegate*<…>Pointer不可以

2. 非托管指针(T*、void* 等)​

范围: Type.IsPointer == true 且非托管元素类型。

2.1 默认 Marshal​

方向形态
C# → JSPointer(地址值令牌;无 三表分派)
JS → C#Pointer;Pop 须匹配

2.2 JS 侧能力​

允许禁止
同步链内 原样 传给下一 C# 调用解引用、读写内存
. 成员、算术
持久化后在异步 / 后续 JS_Call 使用

2.3 [JsMarshalAs]​

允许 Default 与 OpaqueValue(仅 C#→JS)。Object、Table 等 非法。


3. 函数指针​

3.1 默认 Marshal​

方向形态
C# → JSPointer(入口地址)
JS → C#Pointer

3.2 JS 侧​

仅透传;不能从 JS 调用该地址。

3.3 与 Delegate 对比​

类型JS 默认JS 侧可调用
Delegatefunction 或 Delegate exotic可以
delegate*<…>Pointer不可以

4. System.TypedReference​

仅 OpaqueValue(默认即此)。

方向规则
C# → JSPush OpaqueValue;get/set_opaquevalue
JS → C#仅 兼容 OpaqueValue
其它 [JsMarshalAs]非法

5. 其他不支持或受限类型​

5.1 decimal​

方向规则
默认暂不支持
[OpaqueValue](C#→JS)合法

5.2 ref struct(Span<T> 等)​

方向规则
by-val 形参不能 默认 marshal
受控路径OpaqueValue 等(05-STRUCT.md)

5.3 Nullable<T>​

有值同 T;无值 → JS null(不是 undefined 作为 Push 结果);Pop 接受 null/undefined 为无值(01-OVERVIEW.md §2)。

5.4 dynamic​

编译期按 object。

5.5 bigint(JS)​

禁止作为 CLR 整型 / enum / IntPtr 通道 → throw Error('zents: …')(../00-OVERVIEW.md §1.3)。

5.6 开放泛型形参​

由调用时类型实参决定 marshal(../02-TYPE-SYSTEM.md §6)。


6. 注册阶段应拒绝的签名​

条件行为
ref struct by-val 形参拒绝绑定
无法解析的 byref 组合拒绝

允许: GetFunction / delegate bridge 上的 ref/out/in(C#→JS Opaque;JS→C# 03-BYREF.md)。


7. Pointer Pop 细则​

项规则
接受仅 Pointer handle
不 接受number、bigint、ByObj/ByVal exotic、OpaqueValue 隐式互转
null 指针C#→JS:两平台一致(Pointer 或 null,实现须文档化)
不匹配throw Error

8. 三种「非成员分派」令牌对比​

种类用途三表 / 成员脚本读写
Pointer非托管 / 函数指针透传无不可解引用
OpaqueValueC# 栈帧参数槽无get/set_opaquevalue
ByObj/ByVal exotic托管对象 / struct有 IEO. 成员

9. Mono / Il2Cpp 一致性​

Pointer Push/Pop 宽度、TypedReference、decimal/ref struct、bigint 拒绝、错误消息 — 须一致。


10. 相关文档​

文档内容
01-OVERVIEW.md矩阵、number
02-MARSHAL-AS.md合法标注
04-OPAQUE.mdOpaque vs Pointer
09-FUNCTION.mdDelegate