C# Unity和Hololens:读取非文本文件异常

C# Unity和Hololens:读取非文本文件异常,c#,file,unity3d,hololens,il2cpp,C#,File,Unity3d,Hololens,Il2cpp,[已编辑] 首先,我必须道歉,我刚刚注意到,我粘贴的用于读取png文件的代码也不能在.net后端工作(如前所述,txt读取对.net和il2cpp都有效)。调用堆栈来自不同的异常。现在更正了 我们正在为Microsoft Hololens开发一个XR应用程序,其中包括读取txt和二进制文件(后者作为字节数组,由Texture2D.LoadImage作为Unity纹理加载)。由于我们需要为用户提供一种简单的方式来更改/修改文件,所以这两个文件都位于hololens中的3D Objects文件夹中

[已编辑] 首先,我必须道歉,我刚刚注意到,我粘贴的用于读取png文件的代码也不能在.net后端工作(如前所述,txt读取对.net和il2cpp都有效)。调用堆栈来自不同的异常。现在更正了

我们正在为Microsoft Hololens开发一个XR应用程序,其中包括读取txt和二进制文件(后者作为字节数组,由Texture2D.LoadImage作为Unity纹理加载)。由于我们需要为用户提供一种简单的方式来更改/修改文件,所以这两个文件都位于hololens中的3D Objects文件夹中

一切都正常工作,直到最近我们不得不将脚本后端从.net更改为il2cpp;从那时起,每当我们试图读取png文件时,我们都会发现错误,尽管在.net源代码中没有任何更改的情况下仍然可以读取txt文件

我们正在这样读取文本文件(工作正常):

对于PNG,我们尝试了几种不同的方法,形成最简单的
File.ReadAllBytes(pngFile.Path)(它适用于.net,但不适用于il2cpp)、FileStream和其他方法,但它们总是在某些时候失败。最后一点是:

     Windows.Storage.StorageFolder pngObjectsFolder = Windows.Storage.KnownFolders.Objects3D;
     Windows.Storage.StorageFile pngFile = await pngObjectsFolder.GetFileAsync(i.ToString() + ".png");

     Windows.Storage.Streams.IBuffer buffer = await Windows.Storage.FileIO.ReadBufferAsync(pngFile);
     Windows.Storage.Streams.DataReader dataReader = Windows.Storage.Streams.DataReader.FromBuffer(buffer);


     dataReader.ReadBytes (fileData);
。。。将引发此异常:

引发异常:中的“System.NullReferenceException” Assembly-CSharp.dll

并且在调用堆栈中只有以下内容:

在CsvReader.d_uu4.MoveNext()上

所以在我们看来,我们的dataReader保持为空,但我们并不真正了解发生了什么,也不知道如何防止它。有人能为阅读此类文件提供一些建议或想法吗


问候

经过更多的工作,我们终于找到了这不起作用的原因。。。这很尴尬。碰巧数组“fileData”没有初始化。源代码应如下所示:

        Windows.Storage.StorageFolder pngObjectsFolder = Windows.Storage.KnownFolders.Objects3D;
        Windows.Storage.StorageFile pngFile = await pngObjectsFolder.GetFileAsync(i.ToString() + ".png");             
        Windows.Storage.Streams.IBuffer buffer = await Windows.Storage.FileIO.ReadBufferAsync(pngFile);                      
        Windows.Storage.Streams.DataReader dataReader = Windows.Storage.Streams.DataReader.FromBuffer (buffer);

        fileData = new byte[buffer.Length];     
        dataReader.ReadBytes (fileData);
在这一点上,我们将png文件作为字节数组保存在fileData中,我们可以自由地使用它执行任何需要的操作。在本例中,将其加载到Unity 3d纹理对象中:

        tex = new Texture2D(2, 2);
        tex.LoadImage(fileData);

因此,如果其他任何人在用il2cpp后端加载二进制文件时遇到困难,这似乎是一种可靠的方法。

您是否收到异常消息(不仅仅是调用堆栈)也可用吗?我一直在检查和清理一些东西,以修复问题中的一些问题并粘贴异常,我发现了我们的错误并使其正常工作。谢谢你,朋友!
        tex = new Texture2D(2, 2);
        tex.LoadImage(fileData);