Skip to main content
文档站副本

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

指针与不支持类型

规范性: 非托管指针、函数指针、以及 v1 默认不支持或受限的 CLR 形态之 Marshal 规则。 相关: 默认矩阵 → 01-OVERVIEW.mdIntPtr01-OVERVIEW.md §4;OpaqueValue → 04-OPAQUE.md;Delegate → 09-FUNCTION.mdref struct05-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 [TsMarshalAs]

允许 DefaultOpaqueValue(仅 C#→JS)。ObjectTable非法


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 OpaqueValueget/set_opaquevalue
JS → C# 兼容 OpaqueValue
其它 [TsMarshalAs]非法

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

5.1 decimal

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

5.2 ref structSpan<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('zts: …')../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
接受numberbigint、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