用 C# 的橋接機(jī)制解析)
開場想象一下:你在 Unity 項(xiàng)目里用 C++ 寫了一套高性能物理模塊,老板要求把這些接口暴露給 C# 腳本層。你盯著屏幕抓頭發(fā)——C# 字符串是托管堆對象,C++ 這邊是const char*;C# 的Vector3是帶屬性的結(jié)構(gòu)體,C++ 這邊只是三個(gè)浮點(diǎn);C# 調(diào)用可能撞上空引用,C++ 那邊直接段錯(cuò)誤。這活兒手寫怕是要寫到明年。Unity 早就替自己解決了這個(gè)問題。引擎內(nèi)部上千個(gè) C# API(Camera、Transform、Physics……)的背后都是 C++ 實(shí)現(xiàn),這些跨語言膠水不是靠人肉維護(hù)的,而是由內(nèi)部的綁定代碼生成器產(chǎn)出的:在 C# 定義上貼幾個(gè) Attribute,生成器自動(dòng)產(chǎn)出橋接代碼、參數(shù)編組(Marshaling)、空指針檢查、線程檢查。本篇把這套"造橋機(jī)"的工作流程拆開,重點(diǎn)講清兩個(gè)方向的調(diào)用各自怎么走、錢花在哪。說明:綁定生成器是 Unity 的內(nèi)部工具,不隨引擎安裝包分發(fā),其輸入文件格式屬內(nèi)部實(shí)現(xiàn)細(xì)節(jié)、且隨版本演進(jìn)。下文聚焦可公開查證的機(jī)制(InternalCall 注冊、IL2CPP 綁定代碼、UnityCsReference中可見的生成產(chǎn)物),對內(nèi)部文件格式不做逐字段斷言。一、先分清兩個(gè)調(diào)用方向討論"綁定"之前必須先分清方向,因?yàn)閮蓚€(gè)方向的機(jī)制完全不同,混在一起聊是大多數(shù) confusion 的來源:方向