在Unity 5中使用.NET 4.5代码

19

我正在使用Unity3D 5版本制作游戏。该游戏应该使用已经编写在C# .NET4.5引擎中的严格业务规则。我们希望使用Xamarin/Mono,使其可在Windows、Android等平台上使用...

我尝试将引擎构建为dll,并将其用作Unity中的托管插件。但是Unity使用旧版本的Mono来编译整个游戏,并拒绝使用.NET 4.5的dll。

我非常需要使用这段代码,我尝试将其降级到.NET 3.5,但考虑到引擎已经完成的工作,这不是可接受的解决方案。

关于Android,我考虑使用Xamarin获取本地Android代码并将其用作Unity的本地插件。现在我需要解决Windows的问题。我正在探索使用C#代码制作非托管dll的方法,但我很难理解哪种方法适用于此处,COM互操作、C++/CLI或其他方法。

有没有人知道一种在Unity中轻松无障碍地包含.NET 4.5代码的方法?


你需要将你的类库制作成一个PCL(Portable Class Library)类库。 - Ewan
@Ewan:在我看来,Unity似乎只接受用于Windows8/8.1应用程序的PCL。此外,PCL仅支持.NET 4.0+。 - Warrows
你是否将它与新的用于win 8的 .net core 混淆了?我曾经在 iPhone Xamarin 上做过 PCL 的事情,你需要安装 Mono 框架才能针对它进行目标设置。 - Ewan
你将无法使用 .net 4.5 的功能,但如果只是你的核心逻辑,你不应该必须使用它。 - Ewan
当我在Visual Studio中创建PCL项目时,我可以选择Xamarin.Android作为其中一个目标,但如果我想让它适用于Windows,我将需要.NET目标,而这在4.0下不被提议。此外,PCL限制了可用组件,我使用像XmlDocument或Tasks这样的东西。这就是为什么我需要.NET 4.5,不能简单地编译成3.5的原因。 - Warrows
它是受限制的,因此您可以在跨平台上使用它。 - Ewan
3个回答

12

1
截至2017年6月的当前状态: https://forum.unity3d.com/threads/future-plans-for-the-mono-runtime-upgrade.464327/ - Arto Bendiken

8

使用Visual Studio插件:非托管导出,我已经能够将C# .NET 4.5导出为一个非托管/本地dll,可以在Unity引擎中使用。这迫使只调用简单的函数,但是经过一些努力,我成功地封装了我的引擎核心。


2
你的引擎中是否使用了 dynamicAsync / Await 等功能?如果是,请提供一些关于如何包装它们的提示。 - jungle_mole
几个月前,在一个专业项目中,我无法再访问代码了。但是如果我记得正确的话,我的代码中有异步/等待(Async/Await),但是我不需要通过包装来调用它们,所以非常简单明了。 - Warrows
那么,只要你在更新循环中检查一些收到的命令的集合(我想这个集合必须被锁定),并向订阅者“另一端”发送一些消息,就可以了吗?该应用程序计划在哪些平台上运行(或已经运行)? - jungle_mole
1
很抱歉,我无法准确回想起我们成功或失败地完成了什么。但最终由于各种原因,我们不得不转向使用.NET 3.5,这个兼容性问题就是其中之一。 - Warrows

6
短答案是否定的。
据一篇官方博客文章所述,Unity具有“.NET 2.0/3.5时代功能”。
根据同一篇文章,未来版本的Unity将升级到“现代版的.NET”,但没有给出任何时间表。
注意:本答案是针对最初问题的原始版本编写的,该问题仅仅是关于.NET 4.5库能否直接在Unity中使用。

你说短期内不行,但长远来看呢? 我真的需要使用这段代码,我考虑将其降级到.NET 3.5,但考虑到引擎已经完成的工作,这不是一个可接受的解决方案。 关于Android,我想使用Xamarin获取本地Android代码,并将其用作Unity中的本地插件。 现在我需要一个Windows的解决方案。我正在寻找使用C++中的C#代码制作非托管dll的方法,但我很难理解在COM互操作、C++/CLI或其他方法之间适用哪种方法。 - Warrows
即使您可以降级到3.5,也不能保证它能正常工作,因为Unity不完全支持3.5。 Unity支持本地Windows调用,但如何将您的库转换为Windows本机库,恐怕我不知道。祝你好运! - Ghopper21
谢谢,我正在编辑问题以使其更加精确。 - Warrows
1
@Warrows - 关于 Stack Overflow 的友情提示。最好小心地编辑问题,特别是在你从根本上改变问题的情况下,因为这可能会使现有的答案(比如我的答案,你之前接受过)不完整甚至错误。这意味着其他用户可能会认为我的答案是错误的,并可能会对其进行负评。 - Ghopper21
@Warrows - 另外,在这种情况下,如果您提出一个更具体的问题,询问如何将C#库转换为Windows本地代码,那么您更有可能得到特定的帮助。关于“很少/没有努力”的问题的问题在于它是模糊的,一些用户甚至可能会投票关闭您的问题,称其为“过于广泛”。 - Ghopper21
谢谢你的建议,我一直在想什么是最好的行动方案。我以后会更加小心谨慎。我选择进行编辑,因为这样更具体明确。此外,你的回答更像是对我原始担忧的确认,而不是问题的解决方案。 - Warrows

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