How managed code maps to generated C++ code
For each type in the managed code, il2cpp.exe will generate one header file for the C++ definition of the type and another header
file for the method declarations for the type. For example, let’s look at the contents of the converted UnityEngine.Vector3 type.
The header file for the type is named UnityEngine_UnityEngine_Vector3.h. The name is created based on the name of the assembly,
UnityEngine.dll followed by the namespace and name of the type. The code looks like this:
// System.Single UnityEngine.Vector3::x
// System.Single UnityEngine.Vector3::y
// System.Single UnityEngine.Vector3::z
The il2cpp.exe utility has converted each of the three instance fields, and done a little bit of name mangling to avoid conflicts and reserved words.
By using leading underscores, we are using some reserved names in C++, but so far we’ve not seen any conflicts with C++ standard library code.
The UnityEngine_UnityEngine_Vector3MethodDeclarations.h file contains the method declarations for all of the methods in Vector3. For example,
Vector3 overrides the Object.ToString method:
// System.String UnityEngine.Vector3::ToString()
extern "C" String_t* Vector3_ToString_m2315 (Vector3_t78 * __this, MethodInfo* method) IL2CPP_METHOD_ATTR
Note the comment, which indicates the managed method this native declaration represents. I often find it useful to search the files in the output for the name of the managed method in this format, especially for methods with common names, like ToString.