Unity3D,为啥“脚本运行时版本”是 .NET3.5 而“api 兼容级别”是 .NET2.0? PlayerSettings 中的两个选项实际上是啥意思?
Posted
技术标签:
【中文标题】Unity3D,为啥“脚本运行时版本”是 .NET3.5 而“api 兼容级别”是 .NET2.0? PlayerSettings 中的两个选项实际上是啥意思?【英文标题】:Unity3D, why "scripting runtime version" is .NET3.5 but "api compatibility level" is .NET2.0? What do the two options in PlayerSettings actually mean?Unity3D,为什么“脚本运行时版本”是 .NET3.5 而“api 兼容级别”是 .NET2.0? PlayerSettings 中的两个选项实际上是什么意思? 【发布时间】:2018-05-28 13:11:19 【问题描述】:这些天我一直在使用 Unity3D,并查看了有关 .NET 系统的手册。但是感觉很迷茫。
在Unity3D播放器设置中,有“脚本运行时版本”和“api兼容级别”两个选项。
当我将“脚本运行时版本”设置为“.NET 3.5 等效”时,我可以在“.NET 2.0”和“.NET 2.0 子集”之间选择“api 兼容级别”。但是为什么这两个选项值不同呢?他们不应该引用相同的 .NET 版本值吗?两个不同选项中的“.NET”一词是什么意思? Unity3D 实际使用的是哪个 .NET 版本?
并且,当我将“脚本运行时版本”设置为“.NET 4.6 等效”时,我可以将“api 兼容级别”选择为“.NET4.6”。但是为什么此时这两个选项值是一样的呢?
另一方面,我在微软网站上找到了一些介绍 .NET 系统的手册,他们说有 .NET Standard、.NET Framework、.NET Core 和 Mono。根本没有独立的“.NET”实体。
那么,Unity Player Settings的“脚本运行时版本”和“api兼容级别”中的.NET版本究竟是什么意思?
更新
事实:
Unity2017.1.0之前没有“脚本运行时版本”选项
.NET Framework 具有良好的向后compatibility,这意味着 .NET 2.0 组件能够在 .NET 3.5 上运行而不会中断。
当我们谈到 .NET 版本时,它总是指 .NET Framework 的版本。
Unity3D 正在将运行时更新到 .NET 4.6。
推断:
.NET Framework 具有良好的向后兼容性,mono 也是如此。
Unity3D 使用单声道作为运行时,相当于.NET 3.5
Unity3D 仅使用 .NET 2.0 功能进行编译,但具有可在其上运行的 .NET 3.5 运行时。这就是为什么“脚本运行时版本”是“.NET 3.5”时“api 兼容级别”是“.NET 2.0”
Unity3D 正在更新以在 .NET 4.6 运行时使用 .NET 4.6 功能。这就是为什么“脚本运行时版本”是“.NET 4.6”时“api 兼容级别”是“.NET 4.6”
再次更新
这是另一个相关问题:Why does Unity use .NET 2.0 when Mono supports .NET 3.5?
还有一个相关的帖子:https://forum.unity.com/threads/to-linq-or-not-to-linq.223887/
【问题讨论】:
(请记住,这里的问题是为了未来读者的利益,而不仅仅是你。一长串删除线材料不太可能对他们有用,但以可读的方式保持它们的格式肯定是.) 【参考方案1】:.NET 版本在“脚本运行时版本”和“api Unity Player Settings 的兼容性级别”究竟是什么意思?
API 兼容级别:
只是给你一个选项来指定编译器应该如何编译项目。它们是相同的 .Net 版本。请参阅下文,了解每个选项的内容。
.NET 2.0 子集
减小应用大小 增加启动时间使得 为了完成 上面提到的事情。这主要包括 .NET 套接字或网络 API。.NET 2.0 正好相反。
具有更大的构建大小 启动时间有点长 可能包括所有非基于平台的标准 .NET API 在构建中脚本运行时版本:
这是您选择要使用的 .NET 版本的地方。更改此设置将允许您使用选择 .NET API 和运行时版本。
因此,选择 .NET 4.6 可让您使用 .Net 4.6 API 编写代码,Unity 将在您的游戏中包含 .NET 4.6 运行时。 .NET 3.5 也是如此。
想知道为什么他们都将“等效”作为后期修复?这是因为某些 API 和功能在 Unity 中被删除或剥离。您会注意到这一点,但这仅适用于少量 .NET API。其中大多数都受支持。
而且,当我将“脚本运行时版本”设置为“.NET 4.6 等效”时, 我可以选择“api 兼容级别”为“.NET4.6”。但是为什么这两个 此时选项值相同???
不。这不是正确的。您只能在 "Scripting Runtime Version" 选项中看到这两个选项,但您不能选择 ".NET 3.5" if " API 兼容级别" 设置为 ".NET 4.6"。
如果您尝试这样做,Unity 应该重新启动,然后为 "Scripting Runtime Version" 选择 ".NET 3.5" 并自动更改 "API Compatibility Level" 从 ".NET 4.6" 到 ".NET 3.5".
所以,如果 ".NET 4.6" 作为 "API 兼容级别",您必须也选择 ".NET 4.6 " 作为 “脚本运行时版本”。
Unity3D 实际使用的是哪个 .NET 版本?
您在“脚本运行时版本”菜单下选择的那个。
我想知道为什么我只需要选择“.NET 2.0”或“.NET 2.0 Subset” 将“脚本运行时版本”设置为时的“api 兼容性级别” “.NET 3.5”。当“脚本运行时版本”等于“.NET 3.5”时,我 认为“api 兼容级别”应该是“.NET 3.5”或“.NET 3.5” 子集”。这在 Unity 中很奇怪。这里出了什么问题?
许可。
存在许可问题。 Unity 公司更新运行时的唯一方法是向 Xamarin 支付大量资金,因为 Xamirin 制作了 Unity 正在使用的单声道运行时并且在 LGPL 下。他们不想那样做。我注意到在去年与 Microsoft 和 joined .NET 基金会合作后,他们能够更新单声道运行时。
【讨论】:
感谢您的回答!但是你可能会得到一些误解。我想知道为什么在将“脚本运行时版本”设置为“.NET 3.5”时只需要为“api 兼容性级别”选择“.NET 2.0”或“.NET 2.0 子集”。当“脚本运行时版本”等于“.NET 3.5”时,我认为“api 兼容级别”应该是“.NET 3.5”或“.NET 3.5 子集”。这在 Unity 中很奇怪。这里出了什么问题? 你真好。我希望我明白了。总而言之,您的意思是 .NET 版本的“API 兼容级别”没有任何意义。唯一有意义的是子集与否。而“Scripting Runtime Version”的.NET版本才是真正决定Unity3D实际使用的.NET版本的,对吧? 我更新了我的问题并列出了一些假设。你能帮我进一步吗?非常感谢。以上是关于Unity3D,为啥“脚本运行时版本”是 .NET3.5 而“api 兼容级别”是 .NET2.0? PlayerSettings 中的两个选项实际上是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章