# Windows Player: IL2CPP スクリプティングバックエンド

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

Windows Player 用のプロジェクトをビルドする場合に、スクリプティングバックエンドとして Mono の代わりに IL2CPP を使用できます。

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 内でプラグインとして機能します。Windows Player と互換性を持つように C++ ファイルを設定すると、Unity はマネージアセンブリから生成された C++ コードと共にそれらをコンパイルします。

C++ ファイルのプラグインインポーター設定を表示するには、.cpp ファイルをクリックし、Inspector のプラットフォーム設定セクションで適切な **Windows** オプションを選択します。


**C++ ファイルのプラグインインポーターの設定:**
![](/api/media?file=/engine/6000.0/media/images/PlatformIL2CPPPlatformSettings.png)

関数は生成された C++ コードでまとめてリンクされているため、`_P/Invoke` への別の DLL はありません。このため、DLL 名の代わりに `“__Internal”` キーワードを使用します。これにより、関数をランタイムにロードするのではなく、関数を解決するのは 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**                         | Windows ランタイムの PIX。このファイルは開発ビルドにのみ存在します。                                                                                      |
| **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)
