版本:Unity 6 (6000.0)
语言:English
引用其他类库程序集
C# 反射开销

C# 编译器

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

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

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

不支持的功能

C# 9.0

  • 禁止发出 localsinit 标志
  • 协变返回类型
  • 模块初始化程序
  • 非托管函数指针的可扩展调用约定
  • 仅初始化设置器

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

记录支持

C# 9 初始化和记录支持有一些注意事项。

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

非托管函数指针支持

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

以下示例针对 Windows 平台,并且需要在播放器设置允许您为 Unity 生成的最终游戏设置各种特定于播放器的选项的设置。 更多信息
参见词汇表
菜单中启用允许“不安全”代码。有关 C# 的unsafe上下文的更多信息,请参阅Microsoft 的不安全(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
  }
}


其他资源

引用其他类库程序集
C# 反射开销