Skip to main content

TsAlias

给某个 C# 方法指定 JS 侧最终键名换名,不是「默认名 + 额外别名」)。有别名时 不再MethodInfo.Name 注册该方法。单候选时为 direct(O(1)),适合热路径。

权威:重载规范 §5。与其它选重载手段对照见 方法重载

何时用

场景做法
能改 C#,热路径要短名[TsAlias]
不能改源码(预编译 DLL)Settings tsAliasXmlPaths + TsAlias XML
不能改 C#、运行时临时挂名zts.register_method(见 重载
只想精确点名、不在乎写法全签名键 demo['Run(System.Int32)'](5)

[TsAlias] 属性

using ZTS;

public class Demo
{
[TsAlias("run_i32")]
public void Run(int value) { }

public void Run(string value) { }
}
const demo = new CSharp.AC.Demo();
demo.run_i32(10); // 命中 Run(int);该方法不再挂名为 "Run"
demo.Run("hi"); // 仅剩 Run(string) 等未换名的重载
说明
目标Method
每方法最多一个别名(AllowMultiple = false
继承继承到子类重写
语义替换默认 JS 名;不是追加

撞名(允许)

别名可以和其它方法的默认名或其它别名相同 → 并入同一 overload 组,调用时走 dispatch

public void Foo(int x) { }

[TsAlias("Foo")] // Bar 换名为 Foo,并入 "Foo" 组;不再挂 "Bar"
public void Bar(string s) { }

[TsAlias("print")]
public void LogA(int x) { }

[TsAlias("print")] // 两个 print → dispatch
public void LogB(string s) { }
d.Foo("hi"); // 组内选 Bar(string)
d.print(1); // 组内选 LogA(int)
// d.Bar("x") // member not found → throw Error

静态方法写在类型对象上:Demo.add_i32(...);实例用方法调用:obj.run_i32(...)

XML 配置

[TsMarshalAs] 分开

AliasMarshalAs
Settings 字段tsAliasXmlPathsmarshalAsXmlPaths
根元素TsAliasZTSMarshalAs
文件分文件分文件
<?xml version="1.0" encoding="utf-8"?>
<TsAlias version="1">
<Assembly name="Assembly-CSharp">
<Type fullName="Demo">
<Method name="Run" signature="(System.Int32)" alias="run_i32"/>
</Type>
<Type fullName="MyGame.UI.Panel">
<Method name="Show" signature="()" alias="show_panel"/>
</Type>
</Assembly>
</TsAlias>
属性说明
Assembly/@name程序集短名(如 Assembly-CSharp
Type/@fullNameCLR 全名;嵌套 Outer+Inner
Method/@nameC# 方法名
Method/@signature仅参数() / (System.Int32);byref 加 &不含返回类型
Method/@alias必填;该方法的唯一最终 JS 名

优先级与平台

  • 同一方法:Attribute > XML(有 Attribute 则忽略该槽位 XML)
  • Mono:运行时读 tsAliasXmlPaths
  • Il2Cpp:Generate 写入静态表,Player 不读 XML(改 XML 后须重新 Generate)
  • 同一 (assembly, type, method, signature) 多条 @alias失败

与全签名键 / register_method

方式说明
全签名键Bind 自动;不换默认名;demo['Run(System.Int32)'](5)
[TsAlias] / XMLBind 期 换名;热路径首选短名
register_method运行时把已有 direct 挂到 空位短名;不合并 overload

常见错误

现象原因
demo.Run(10) 调不到已标 alias 的重载已换名,应使用别名或其它未换名的重载
demo.Bar → throwBar[TsAlias("Foo")] 换走(miss → Error,非 undefined
XML 不生效(Player)未重新 Generate;或路径写在了 marshalAsXmlPaths
与 MarshalAs 写在同一根元素须独立 TsAlias 文件

相关文档