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