Version: 2023.2
言語: 日本語
追加のクラスライブラリアセンブリの参照
スクリプティングバックエンド

C# コンパイラー

Unity プロジェクトで C# ソース コードをコンパイルするために、Unity エディターは C# コンパイラーを使用します。

C# コンパイラー C# 言語バージョン
Roslyn C# 9.0

エディターはデフォルトの一揃いのオプションを C# コンパイラーに渡します。プロジェクトの追加のオプションを渡すには、プラットフォーム依存のコンパイル のドキュメントを参照してください。

サポートされない機能

C# 9.0

  • localsinit フラグ送信の制御
  • 共変戻り値型
  • モジュール初期化子
  • アンマネージ関数ポインターの拡張可能な呼び出し規則
  • Init のみのセッター

サポートされない機能をプロジェクトで使用しようとすると、コンパイルでエラーが発生します。

レコード対応

C# 9 の init と record (レコード) のサポートには、いくつかの注意点があります。

  • System.Runtime.CompilerServices.IsExternalInit 型は init のみのセッターを使用するため、レコードの完全なサポートに必要ですが、.NET 5 以降 (Unity ではサポートなし) でのみ利用可能です。ユーザーは、自分のプロジェクトで System.Runtime.CompilerServices.IsExternalInit 型を宣言することによって、この問題を回避することができます。
  • Unity のシリアル化システムは C# レコードをサポートしていないため、シリアル化された型に C# レコードを使用すべきではありません。

アンマネージ関数ポインターのサポート

Unity は C# 9 で導入されたアンマネージ関数ポインターをサポートしていますが、拡張可能な呼び出し規則はサポートしていません。以下のサンプルコードでは、アンマネージ関数ポインターを正しく使用する方法について、より詳細な情報を提供します。

以下の例は Windows プ ラ ッ ト フ ォーム を対象 と し てお り、Player 設定 メニューで Allow ‘unsafe’ code を有効にする必要があります。C# の unsafe コンテキストの詳細については、Microsoft の unsafe (C#リファレンス) のドキュメント または Microsoft の アンセーフ コード、ポインター型、関数ポインターのドキュメント を参照してください。


using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class UnmanagedFunctionPointers : MonoBehaviour
{
  [DllImport("kernel32.dll")]
  static extern IntPtr LoadLibrary(string lpLibFileName);
  
  [DllImport("kernel32.dll")]
  static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
  
  // You must enable "Allow 'unsafe' code" in the Player Settings
  unsafe void Start()
  {
# if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
    // This example is only valid on Windows
    
    // Get a pointer to an unmanaged function
    IntPtr kernel32 = LoadLibrary("kernel32.dll");
    IntPtr getCurrentThreadId = GetProcAddress(kernel32, "GetCurrentThreadId");

    // The unmanaged calling convention
    delegate* unmanaged[Stdcall]<UInt32> getCurrentThreadIdUnmanagedStdcall = (delegate* unmanaged[Stdcall]<UInt32>)getCurrentThreadId;
    Debug.Log(getCurrentThreadIdUnmanagedStdcall());
# endif
  }
}


追加のクラスライブラリアセンブリの参照
スクリプティングバックエンド