C++ 通过类库从Unity IL2CPP项目访问Windows 10函数
我一直在尝试创建一个UWP类库,使我能够访问Windows 10s的本机功能,如Windows.Security.Authentication.OnlineId。我想从设备中获取用户名和ID,用于Unity UWP IL2CPP项目。目前,我可以通过Unity内置的ios社交类来实现这一点,谷歌已经编写了一些代码,允许它与android的google Play游戏以外的同一个类无缝工作 我下载了Github()中的一个示例,演示如何调用UWP应用程序中的相关类和函数,并且工作良好,但是样本似乎是从“Windows .Fase.UniValSalPixToupe”类访问类。 我似乎找不到方法将其添加到基本的UWP类库中,以便调用所需的类,如Windows::Security::Credentials::WebAccountProvider 我所能做的最好的事情就是在类库中创建一个基本函数,返回一个小的硬编码字符串,以测试这个概念是否有可能实现。 :-C++ 通过类库从Unity IL2CPP项目访问Windows 10函数,c++,unity3d,visual-studio-2015,uwp,il2cpp,C++,Unity3d,Visual Studio 2015,Uwp,Il2cpp,我一直在尝试创建一个UWP类库,使我能够访问Windows 10s的本机功能,如Windows.Security.Authentication.OnlineId。我想从设备中获取用户名和ID,用于Unity UWP IL2CPP项目。目前,我可以通过Unity内置的ios社交类来实现这一点,谷歌已经编写了一些代码,允许它与android的google Play游戏以外的同一个类无缝工作 我下载了Github()中的一个示例,演示如何调用UWP应用程序中的相关类和函数,并且工作良好,但是样本似乎是
extern“C”\uuu declspec(dllexport)wchar\u t*\uuu stdcall GetMyString()
{
wchar_t*myString=L“Guuuper”;
auto resultBufferLength=wcslen(myString)+1;
wchar_t*结果=静态强制转换(CoTaskMemAlloc(resultBufferLength*sizeof(wchar_t));
wcscpy_s(结果、结果缓冲长度、myString);
返回结果;
}
我尝试这样做的整个过程可以在这里找到:-
我已经能够通过UWP构建从unity内部成功调用此代码,但我的主要问题是如何添加适当的引用,或者如何创建此类库以访问WebAccountProvider类
任何帮助都将不胜感激
更新:我已经就这一挑战询问了微软团队,他们似乎正在研究解决方案。对于“回答”而不是“评论”表示歉意,但我仍然是一名新的贡献者 我最初的直觉是怀疑你的问题不在于Unity3D;它使用C#和Unity3D中的整个编程环境。C#不允许非托管内存分配。有一个让C++库在C++中工作的全部艺术,它被称为“封送”代码,并且有一个完整的行业,它围绕着从C++到UnyT3D的封送插件。 你没有得到一个字符串的原因是,你实际上是在发送和接收一个指向单个字符的指针 遗憾的是,我的单一经验封送统一代码C++是在五年前,我对我的解决方案有点生疏。我记得的是,最“黑客”但最明显的解决方案是计算出可能传递的字符串的最大大小,并且在除法的两侧,传递和接收预定义大小的字符串
让我们知道这是否给了您正确的方向。
C#不允许非托管内存分配
。你听说过吗?它看起来像是2015年推出的System.Runtime.InteropServices名称空间,五年前就推出了Marshal类,正好赶上我已经完成了我的项目,并且无法从中受益,;)但是,是的,这就是为什么它被称为“编组”,它显然是用于编组非托管到托管。似乎取代了PInvokes,或者至少是PInvokes的更干净的替代品。看起来还需要尝试StringBuilder类。
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;
}