22

我一直在尝试创建一个 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 构建从统一内部成功调用此代码,但我的主要问题是如何添加适当的引用或如何创建此类库以访问 WebAccountProvider 类?

任何帮助将非常感激

更新:我已经在他们自己的网站上向 MS 团队询问了这个挑战,他们似乎正在寻找解决方案。

4

1 回答 1

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

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

于 2020-09-12T03:02:31.663 回答