【问题标题】:Accessing Windows 10 functions from Unity IL2CPP project via a class library通过类库从 Unity IL2CPP 项目访问 Windows 10 功能
【发布时间】:2016-11-21 12:41:07
【问题描述】:

我一直在尝试创建一个 UWP 类库,让我可以访问 Windows 10 的原生功能,例如 Windows.Security.Authentication.OnlineId。我想从设备中获取用户名和 ID,以便在 Unity UWP IL2CPP 项目中使用。我目前能够使用 Unity 为 ios 内置的社交类来做到这一点,并且谷歌编写的代码允许它与同一类无缝工作,但适用于 android 的 Google Play 游戏。

我从 github (https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/WebAccountManagement) 下载了一个示例,该示例演示了如何在 UWP 应用程序中调用相关的类和函数并且运行良好,但示例似乎是从“Windows.Foundation.UniversalApiContract”访问类" 类。

我似乎找不到将其添加到基本 UWP 类库的方法,因此我可以调用所需的类,例如 Windows::Security::Credentials::WebAccountProvider。

我能做的最好的事情是在类库中创建一个基本函数,它返回一个小的硬编码字符串,只是为了测试这个概念是否远程可行。 :-

extern "C" __declspec(dllexport) wchar_t* __stdcall GetMyString()
{
    wchar_t* myString = L"Guuuper";
    auto resultBufferLength = wcslen(myString) + 1;
    wchar_t* result = static_cast<wchar_t*>(CoTaskMemAlloc(resultBufferLength * sizeof(wchar_t)));
    wcscpy_s(result, resultBufferLength, myString);
    return result;

}

我尝试这样做的整个过程都可以在这里找到:- http://forum.unity3d.com/threads/returning-c-string-to-il2cpp-windows-store-project.395284/

我已经能够通过 UWP 构建从 unity 中成功调用此代码,但我的主要问题是如何添加适当的引用或如何创建此类库以访问 WebAccountProvider 类?

任何帮助将不胜感激

更新:我已经通过their own site 向 MS 团队询问了这个挑战,他们似乎正在寻找解决方案。

【问题讨论】:

    标签: c++ unity3d visual-studio-2015 uwp il2cpp


    【解决方案1】:

    为“回答”而不是“评论”道歉,但我仍然是新的贡献者。

    我最初的第一直觉是怀疑你的问题不在于 Unity3D。它与 C# 和 Unity3D 中的整个编程环境一起使用。 C# 不允许非托管内存分配。让 C++ 库在 C# 中工作是一门艺术,它被称为“编组”代码,因此整个行业都基于从 C++ 到 Unity3D 的编组插件。

    你没有得到一个字符串的原因是因为你实际上是在发送和接收一个指向单个字符的指针。

    不幸的是,我为 Unity 编组 C++ 代码的单一经验是五年前,我对我的解决方案有点生疏。我记得的是,最“hacky”但最明显的解决方案是计算出可能传递的字符串的最大大小,并且在分界线的两侧,传递和接收该预定义大小的字符串。

    https://docs.microsoft.com/en-us/dotnet/framework/interop/default-marshaling-for-strings

    让我们知道这是否会让您朝着正确的方向前进。

    【讨论】:

    • C# does not allow for unmanaged memory allocation。你听说过Marshal.AllocHGlobal吗?
    • 看起来像具有 Marshal 类的 System.Runtime.InteropServices 命名空间于五年前的 2015 年问世,正好赶上我已经完成了我的项目并且无法从中受益从它,;) 但是,是的,这就是为什么它被称为 Marshal,这显然是 Marshalling 无法管理的。似乎取代了 PInvokes,或者至少是一个更清洁的替代品。看起来还有 StringBuilder 类可以尝试。
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 2017-07-04
    • 1970-01-01
    • 2022-10-19
    • 2019-10-27
    • 2018-08-21
    • 2013-08-23
    • 2021-08-03
    相关资源
    最近更新 更多