版本:2022.3
语言:英语
引用额外的类库程序集
脚本后端

C# 编译器

要在 Unity 项目中编译 C# 源代码,Unity 编辑器使用 C# 编译器。

C# 编译器 C# 语言版本
Roslyn C# 9.0

编辑器会传递一组默认选项到 C# 编译器。要在项目中传递额外的选项,请参阅有关平台相关编译的文档。

不支持的功能

C# 9.0

  • 压制发出生成 localsinit 标志
  • 可变返回类型
  • 模块初始化器
  • 可扩展的未托管函数指针调用约定
  • 仅初始化的设置器

如果您在项目中尝试使用不受支持的功能,编译将生成错误。

记录支持

C# 9 init 和记录支持存在一些注意事项。

  • 完整的记录支持需要类型 System.Runtime.CompilerServices.IsExternalInit,因为它使用仅初始化的设置器,但仅在 .NET 5 及以后的版本中(Unity 不支持)中可用。用户可以通过在其自己的项目中声明 System.Runtime.CompilerServices.IsExternalInit 类型来解决此问题。
  • 您不应该在序列化类型中使用 C# 记录,因为 Unity 的序列化系统不支持 C# 记录。

未托管函数指针支持

Unity 支持从 C# 9 引入的未托管函数指针,但不支持可扩展的调用约定。以下示例代码提供了关于如何正确使用未托管函数指针的更详细信息。

以下示例代码针对 Windows 平台,需要在 玩家设置允许您为最终由 Unity 构建的游戏设置各种玩家特定选项的设置。更多信息
See in Glossary
菜单中启用“允许 ‘unsafe’ 代码”。有关 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
  }
}


引用额外的类库程序集
脚本后端