【问题标题】:Unable to use MongoDB C# driver with Hololens无法将 MongoDB C# 驱动程序与 Hololens 一起使用
【发布时间】:2019-08-13 07:33:52
【问题描述】:

我正在尝试在使用Unity 2019.1.13f1Hololens 构建的UWP 应用程序中使用MongoDB C# driver (2.8.1)。我读到这个驱动程序(如果我是正确的,它针对.NET 4.x)与UWP 应用程序完全兼容,因为Windows SDK 16299。然而,即使它在Unity Editor 中发挥了作用,但部署到Hololens 时并非如此(我无法连接到我的数据库)。

我尝试使用.NET 4.x API 兼容级别构建项目,并且我已授予该应用所有必要的功能(*InternetClient*, *InternetClientServer*, *PrivateNetworkClientServer*)

这在运行时触发了这个异常:Unsupported internal call for IL2CPP:Module::GetPEKind

然后,我尝试将API兼容级别更改为.NET Standard 2.0

这使得上面的异常消失了,但还是不行……

你有什么想法吗?我可能会认为这个驱动与Hololens毕竟不兼容......

提前致谢

编辑

经过多次尝试,我终于得出了这个结论:

  • MongoDB C# 驱动程序当前(截至 Unity 2019.1.13f1)与 Hololens 上的 IL2CPP 不兼容,因为它试图进行后者不支持的 call(非常特别是在尝试调用new MongoClient())。
  • 我无法使用 .NET 后端在 Unity 2018.4 上编译我的项目(显然这个后端存在巨大的兼容性问题,这就是 Unity 放弃它的原因)。

老实说,我根本不是UWP 方面的专家,但由于其他人已经设法使这个驱动程序在“正常”UWP 设备上使用 IL2CPP 按预期工作,我猜这可能与Hololens 软件(我知道它使用 Windows 10 的特殊版本)。

【问题讨论】:

  • 您是否尝试过使用 .NET 后端而不是 IL2CPP 进行编译?
  • @JuliaSchwarz 这是个好建议!我会尝试一下,看看它是否有效。谢谢!
  • 嗯,Unity 似乎在 2019.1 版本(我正在使用的那个)中删除了 .NET 脚本后端,所以我需要找到另一个解决方案...
  • 只需做一个快速测试,将一个由 Visual Studio 开发的 UWP 应用程序部署到 HoloLens,它对我来说效果很好。普通的 UWP 对您有用吗?
  • 是的,一个普通的 UWP 工作正常,我的应用程序工作正常,除了 MongoDB 部分。我认为这可能与 Unity 使用的 IL2CPP 后端有关......

标签: c# mongodb unity3d hololens


【解决方案1】:

经过大量修改后,我找到了一种使 MongoDB C# 驱动程序与 Unity IL2CPP 构建一起工作的方法(我在 PC 和 UWP 构建上对其进行了测试,但我想它也适用于其他人) 为了让它工作,我必须对驱动程序进行自定义构建,并注意其他细节。 但在我详细介绍我的发现之前,这里有一个指向我上传的示例项目的链接:MongoDB IL2CPP Example Project(不要忘记更改 MongoDBTester.cs 以使用您的 MongoDB 实例)

这就是我所做的:

MongoDB 驱动程序: 在驱动程序源的 ClientDocumentHelper.cs 中有一个函数 CreateOSDocument() 包含一个部分 #if NET452 - 我刚刚删除了整个部分并在 Unity 中使用 IL2CPP 构建进行了尝试,它解决了 OPNotSupportedException

Unity - 装配剥离: 剥离过程删除了一些实际需要的代码,我使用链接器文件修复了这些代码 - link.xml 在我的示例项目的插件文件夹中。

Unity - AOT 和反射: MongoDB 驱动程序在某些事情上使用反射,例如为集合获取正确的序列化程序。 C++ 构建的 AOT 特性和 IL2CPP 的工作方式并不能很好地融合(参见 Unity Docs - Scripting Restrictions)。 幸运的是,这很容易解决:如果您使用泛型类(如 Dictionary),则需要使用 BsonSerializerAttribute 指定 Serializer 对于构造函数,在使用带参数的构造函数时会发生同样的问题 - 我只是确保 零参数公共构造函数 可用于与 MongoDB 一起使用的所有类。

统一 - IPv4: 我不确定这是否与 Unity 或 MongoDB 驱动程序有关,或者可能只是托管我的 MongoDB 实例的服务器,但我遇到了一个问题,即我的地址协议不受支持。所以我写了一个解决方法来改用 IPv4

补充说明: 我注意到我的课程的自动映射并不总是有效。我还没有完全弄清楚它何时以及为什么不起作用,但如果发生这种情况,只需使用 BsonClassMap.RegisterClassMap

手动映射类

希望这会有所帮助,让我知道它是否适合您或您是否遇到任何其他问题。

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 2015-04-16
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多