Unity3D :C# 编译器
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
C# 编译器
为了在 Unity 项目中编译 C# 源代码,Unity Editor 使用 C# 编译器。
C# 编译器 | C# 语言版本 |
---|---|
罗斯林 | C# 9.0 |
编辑器将一组默认选项传递给 C# 编译器。若要在项目中传递其他选项,请参阅有关平台相关编译的文档。
不受支持的功能
C# 9.0
- 抑制发出局部sinit标志
- 协变返回类型
- 模块初始值设定项
- 非托管函数指针的可扩展调用约定
- 仅初始化二传手
如果尝试在项目中使用不受支持的功能,编译将生成错误。
记录支持
C# 9 初始化和记录支持附带了一些注意事项。
- 该类型是完整记录支持所必需的,因为它使用仅初始化资源库,但仅在 .NET 5 及更高版本中可用(Unity 不支持)。用户可以通过在自己的项目中声明类型来解决此问题。
System.Runtime.CompilerServices.IsExternalInitSystem.Runtime.CompilerServices.IsExternalInit
- 不应在序列化类型中使用 C# 记录,因为 Unity 的序列化系统不支持 C# 记录。
非托管函数指针支持
Unity 支持 C# 9 中引入的非托管函数指针,但不支持可扩展的调用约定。下面的示例代码提供了有关如何正确使用非托管函数指针的更多详细信息。
以下示例面向 Windows 平台,并要求在“播放器设置”菜单中启用“允许”不安全“代码。有关 C# 上下文的详细信息,请参阅 Microsoft 的不安全(C# 参考)文档或 Microsoft 的不安全代码、指针类型和函数指针文档。unsafe
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
}
}
由3D建模学习工作室整理翻译,转载请注明出处!