通过类库从Unity IL2CPP项目访问Windows 10功能

22

我一直在尝试创建一个UWP类库,以便让我可以访问Windows 10的本地功能,例如Windows.Security.Authentication.OnlineId。我想获取设备的用户名和ID,以在Unity UWP IL2CPP项目中使用。目前,我能够通过Unity内置的ios社交类来实现此操作,并且谷歌编写的代码允许使用相同的类轻松地实现这一点,但用于android的Google Play Games。

我从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类?

非常感谢任何帮助。

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

1个回答

1
抱歉我回答而不是评论,因为我还是一个新的贡献者。我的第一反应是怀疑你的问题不是来自Unity3D,而是来自C#以及Unity3D内部的整个编程环境。C#不允许未管理的内存分配。有一个完整的艺术是让C++库在C#中工作,这被称为“编组代码”,并且有一个完整的行业基于从C++到Unity3D的组合插件。
你没有收到字符串的原因是因为你实际上发送和接收了一个指向单个字符的指针。
不幸的是,我个人五年前曾经为Unity混合C++代码,现在我对我的解决方案有些生疏了。我所记得的是最"hacky"但是显然的解决方案是计算可能传递的字符串的最大大小,并且在分界线两侧,传递并接收预定义大小的字符串。

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

如果这能帮助你找到正确的方向,请告诉我们。


C# 不允许进行非托管内存分配。你听说过 Marshal.AllocHGlobal 吗? - Julian Kirsch
看起来是在2015年出现了包含Marshal类的System.Runtime.InteropServices 命名空间,五年前的事了,正好错过了我已经完成项目并无法从中受益。但是,是的,这就是为什么它被称为Marshal,显然是用于将非托管转换为托管。看起来取代了,或者至少是更干净的替代方式,PInvokes。似乎还有StringBuilder类可供尝试。 - Gaming Impteraix

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