[已编辑] 首先,我必须道歉,我只是注意到粘贴的一些代码,因为我们读取png文件的代码在.net后端中均不能不使用(txt读取对.net都适用和il2cpp,如前所述)。调用堆栈来自另一个异常。现在已更正
我们正在为Microsoft Hololens开发XR应用程序,其中涉及读取txt和二进制文件(后者作为字节数组,由Texture2D.LoadImage作为Unity纹理加载)。由于我们需要为用户提供一种简单的方式来更改/修改文件,这两个文件都位于hololens的3D对象文件夹中。
一切正常,直到最近我们不得不将脚本后端从.net更改为il2cpp为止;从那时起,尽管我们仍可以在不更改.net源代码的情况下读取txt的情况下尝试读取png文件,但发现错误。
我们正在读取这样的文本文件(工作正常):
Windows.Storage.StorageFolder objectsFolder = Windows.Storage.KnownFolders.Objects3D;
Windows.Storage.StorageFile csvFile = await objectsFolder.GetFileAsync(oneFile);
string contentText = await Windows.Storage.FileIO.ReadTextAsync(csvFile);
对于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__4.MoveNext()
因此,在我们看来,dataReader保持为空,但我们真的不了解发生了什么,也没有办法防止它发生。谁能提供一些建议或想法来阅读此类文件?
致谢!
答案 0 :(得分:2)
经过更多的工作,我们终于找到了为什么它不起作用...而且令人尴尬。碰巧数组“ 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);
到那时,我们在fileData中将png文件作为字节数组,我们可以自由地对其进行所需的操作。在我们的示例中,将其加载到Unity 3d纹理对象中:
tex = new Texture2D(2, 2);
tex.LoadImage(fileData);
因此,如果其他任何人都在努力使用il2cpp后端加载二进制文件,这似乎是一种可靠的方法。