类型 Task<> 存在于 Unity.Tasks 和 mscorelib 中(Unity 问题)

Type Task<> exists in both Unity.Tasks and mscorelib (Unity Question)

我 运行 遇到了一个令人恼火的问题。我在我的项目中使用 System.Threading.Tasks。我最近导入了一个新插件 (Google Firebase),它附带了自己的 dll (Unity.Tasks)。好吧,Google 的天才们似乎没有意识到 Unity 完全支持 System.Threading.Tasks,并决定将该命名空间与他们的 dll 捆绑在一起。我无法摆脱 Unity.Tasks 否则它会破坏 Firebase。我不能使用外部别名来引用 mscorelib,否则我会收到错误消息,指出我的代码没有 return a Task<>(在我使用别名之前确实如此)。我不知道我应该在这里做什么。我真的很想使用firebase,因为它很容易实现,但我还需要在我的项目中使用Tasks来进行异步编程。有人有什么好主意吗?

注意:我使用的是 Unity 2020 beta 2 和 .Net 4.0 以及 IL2CPP 后端。我尝试过 .NET 2.0、单声道后端和 Unity 2019.x。没有成功。任何帮助表示赞赏。

此外:我确实检查了所有其他 Stack Overflow 答案,其中 none 将适用于我的实例。我都试过了。

Here is a screenshot of the error thrown in Visual Studio

出于向后兼容的原因,Firebase SDK 中提供了重复的任务实现。如果您导入了 dotnet4 文件夹,默认情况下不应启用它,但是如果您丢失了 .meta 文件(或 Library 目录,如果您不使用 .meta 文件)或一直在手动调整构建设置(例如:在编写 .asmdef 文件时引入错误的依赖项),您可能会再次引入不正确的依赖项。

勾选Assets/Parse/Plugins

确保基本级别 Unity.TasksUnity.Compat 已禁用(如果需要,您可以删除它们)。

并确保 dotNet45 文件夹中的 dll 已启用:

你应该可以开始了!

顺便说一句:您可能想知道我们为什么要包括 Unity.Tasks。 Firebase 不会针对原始任务实现进行编译,dotNet45 实现转发了一些函数并确保无需重写任何代码即可使用 Firebase。

既然我已经给了你这个简短的概述,你还可以做一件事。 Support for the Unity Package Manager 刚刚发布。如果您使用的是受支持的 Unity 版本(2018.4 或更高版本),则可以将 Firebase 移至 UPM。然后,所有这些文件都将移动到 Library 文件夹,并有望自动保持清洁以供您继续使用。有一些小问题(例如:我上次检查时修补 gradleTemplate.gradle 不太有效,这是一个可选功能),但它总体上可能是一个更清晰的集成(并且应该随着时间的推移而改进)。

希望对您有所帮助!

--帕特里克