# Windows 播放器：IL2CPP 脚本后端

> Use IL2CPP with Windows Player and add compatible C++ source code plug-ins to your build.

您可以将 IL2CPP 用 Mono 的替代品，在为 Windows 播放器构建项目时用于编写后端脚本。

使用 IL2CPP 构建项目时，Unity 会在创建本机二进制文件之前将脚本和程序集内的 IL 代码转换为 C++。请参阅 [IL2CPP](/engine/6000.0/manual/scripting/compilation-and-code-reload/backends/il2cpp.md) 以了解更多信息。

## 适用于 IL2CPP 的 C++ 源代码插件##c++-source-code-plugins-for-il2cpp

使用 [IL2CPP](/engine/6000.0/manual/scripting/compilation-and-code-reload/backends/il2cpp.md) 脚本后端时，可将 C++ (.cpp) 代码文件直接添加到 Unity 项目中。这些 C++ 文件充当插件检视面板 (Plugin Inspector) 中的插件。如果将 C++ 文件配置为与 Windows 播放器兼容，则 Unity 会将这些文件与从托管程序集生成的 C++ 代码一起编译。

若要查看 C++ 文件的插件导入器设置，点击 .cpp 文件，在检视面板的平台设置部分选择适当的 **Windows** 选项：


**关于 C++ 文件的插件导入器设置:**
![](/api/media?file=/engine/6000.0/media/images/PlatformIL2CPPPlatformSettings.png)

因为函数与生成的 C++ 代码链接在一起，所以没有单独的 DLL 可进行 `_P/Invoke` 调用。因此，可使用 `“__Internal”` 关键字代替 DLL 名称，从而使 C++ 链接器负责解析函数，而不是在运行时加载函数，如下例所示：

```
[DllImport("__Internal")]
private static extern int
CountLettersInString([MarshalAs(UnmanagedType.LPWStr)]string str);
```

可在 `NativeFunctions.cpp` 中定义此类函数，如下所示：

```
extern "C" __declspec(dllexport) int __stdcall CountLettersInString(wchar_t* str)
{
    int length = 0;
    while (*str++ != L'\0')
        length++;
    return length;
}
```

因为由链接器负责解析函数调用，所以在托管端的函数声明（在托管运行时执行的 C# 代码）中发生的任何错误都会生成链接器错误而不是运行时错误。这意味着，在运行时无法进行动态加载，而是直接从 C# 调用函数，从而显著降低了 `P/Invoke` 调用的性能开销。

Unity 使用与生成的 C++ 代码相同的 C++ 编译器参数编译源代码插件，这些参数无法修改。如果某些插件源代码需要控制 C++ 编译器参数，则必须改为构建原生插件。有关更多信息，请参阅[原生插件](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native.md)。

## IL2CPP 构建文件##il2cpp-build-files

使用 IL2CPP 脚本后端的项目通常会生成以下文件：


**构建期间生成的 IL2CPP 文件:**
![](/api/media?file=/engine/6000.0/media/images/IL2CPPBuildProducedFiles.png)

以下文件是使用 IL2CPP 的项目共有的：

| **文件：**                                            | **描述：**                                                                      |
| -------------------------------------------------- | ---------------------------------------------------------------------------- |
| **a\_Data**                                        | 包含游戏数据的文件夹。                                                                  |
| **a.exe**                                          | 主游戏可执行文件。                                                                    |
| **UnityCrashHandler64.exe**                        | 崩溃处理程序可执行文件。                                                                 |
| **UnityPlayer.dll**                                | 包含所有本机代码的 Unity Player 库。                                                    |
| **WinPixEventRuntime.dll**                         | PIX for Windows 运行时。此文件仅存在于开发构建中。                                            |
| **a\_BackUpThisFolder\_ButDontShipItWithYourGame** | 包含调试游戏所需数据的文件夹，包括 PDB（调试信息）文件和脚本生成的 C++ 代码。应为发布的每个构建备份此文件夹，但不要重新分发它。         |
| **GameAssembly.dll**                               | 包含 IL2CPP 运行时和所有脚本代码的库。                                                      |
| **SymbolMap**                                      | 包含所有托管函数地址及其长度的列表的文件。IL2CPP 需要此文件来解析托管堆栈跟踪。如果将其删除，仍然可以运行游戏，但无法保证异常会生成合理的调用栈。 |

## 其他资源：##additional-resources:

* [插件检视面板](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/plug-in-inspector.md)
* [IL2CPP](/engine/6000.0/manual/scripting/compilation-and-code-reload/backends/il2cpp.md)
* [使用 P/Invoke](https://docs.unity3d.com/Manual/uwp-pinvoke.html)
