Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过类库从Unity IL2CPP项目访问Windows 10函数_C++_Unity3d_Visual Studio 2015_Uwp_Il2cpp - Fatal编程技术网

C++ 通过类库从Unity IL2CPP项目访问Windows 10函数

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应用程序中的相关类和函数,并且工作良好,但是样本似乎是

我一直在尝试创建一个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

我所能做的最好的事情就是在类库中创建一个基本函数,返回一个小的硬编码字符串,以测试这个概念是否有可能实现。 :-

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;

}