在Unity中使用动态关键字/.NET 4.6特性

6

我正在尝试将GraphQL应用到Unity3D(版本2017.1.0f3 Personal)中。我正在使用.NET 4.6(实验性),但是尽管如此,Unity不支持dynamic关键字。这很奇怪,因为在.NET 4.0中,它是.NET的一部分。除了在Unity中。我正在搜索解决方案以使其工作,但没有动态关键字的解决方案。错误如下:

Severity    Code    Description Project File    Line    Suppression State
Error   CS1980  Cannot define a class or member that utilizes 'dynamic' 
because the compiler required type 
'System.Runtime.CompilerServices.DynamicAttribute' cannot be found. Are you 
missing a reference?    skiing-prototype (1)    D:\skiing-prototype 
(1)\Assets\Scripts\GraphQL.cs   62  Active

这是使用GraphQL C#客户端唯一的附带条件。有人尝试过让它工作吗?我还没有找到任何更大的努力来使其运行起来。 编辑: 我正在使用这个客户端:https://github.com/bkniffler/graphql-net-client 此外,这是Visual Studio的一个错误,但在Unity控制台中也显示错误,稍后会更新具体内容。
Assets/Scripts/GraphQL.cs(80,16): error CS1980: Dynamic keyword requires 
`System.Runtime.CompilerServices.DynamicAttribute' to be defined. Are you 
missing System.Core.dll assembly reference?

这是Unity编辑器的错误,似乎与Visual Studio中的相同。

不,我不这样做,因为在Unity中,我无法从Visual Studio传递任何类型的dll,只能从插件文件夹中传递。 - Citrus
Visual Studio 的版本是什么? - Programmer
Visual Studio 2017 社区版 - Citrus
好的,最后一个问题。你能否检查另一个4.6功能是否正常工作?在回答之前,我想验证一下这个。 - Programmer
我可以问一下你想了解哪个功能吗? - Citrus
显示剩余3条评论
2个回答

12
第一步是检查Unity是否识别这两个基本的C# 6特性,可以从MS站点查询。

1.尝试使用"索引初始化程序"功能:

private Dictionary<int, string> webErrors = new Dictionary<int, string>
{
    [404] = "Page not Found",
    [302] = "Page moved, but left a forwarding address.",
    [500] = "The web server can't come out to play today."
};

2. 然后是 "字符串插值" 功能:

private string FirstName = "";
private string LastName = "";
public string FullName => $"{FirstName} {LastName}";

如果出现错误,问题不仅仅是使用"dynamic"关键字,而是Visual Studio无法识别Unity设置的.NET版本。从评论部分来看,你的Unity未能编译第一个示例。
按照步骤逐一进行可能的修复。不要跳过任何一个步骤。
1.转到编辑-->项目设置-->玩家-->其他设置-->配置-->脚本运行时版本-->实验性(.Net 4.6等效)。
2.转到编辑-->项目设置-->玩家-->其他设置-->配置-->API兼容性级别-->.NET 4.6
3.重新启动Unity编辑器和Visual Studio。必须同时重新启动。
测试上述两个C#功能。如果它们有效,则dynamic关键字也应该有效。如果无效,则继续执行第4步。
4.更新Visual Studio。这非常重要。将Visual Studio更新到最新版本/补丁。
5.如果仍然无法编译上述两个C#6功能,则重新安装Visual Studio和Unity,然后再次执行步骤#1和#2,因为某些文件丢失了。
6.最后,如果您已经使两个C#6功能正常工作,但是动态关键字仍然无法正常工作,则从Unity 2017.1更新到Unity 2017.2。此版本修复了许多.NET问题。
请注意,我正在使用Unity 2017.2dynamic关键字而没有任何问题。此外,GraphQL也可以正常工作。

如果您列出的1和2功能正常工作,但动态仍然无法正常工作,这是什么意思? - user441521
我有Unity 2017.2.0b8。 - user441521
@JDOaktown 这是一个问题还是评论? - Programmer
我不得不插入 using System.Collections.Generic; 才能使这个“Dictionary”声明工作。 - JDOaktown

7
我似乎找到了解决方案。
导航到编辑 > 项目设置 > 玩家 > 其他设置 > 配置 > API兼容级别,并将其从.NET Standard 2.0更改为.NET 4.x
这将立即删除编译器错误,并允许我使用dynamic关键字运行代码。
如果有用,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接