[编辑]首先我要道歉,我刚刚注意到我粘贴的代码,因为我们的读取png文件的代码也不能在.net后端工作(txt读取对两者都有效,.net和il2cpp,如说明)。调用堆栈来自另一个异常。现在纠正了
我们正在为Microsoft Hololens的XR应用程序工作,它涉及读取txt和二进制文件(后者作为字节数组,由Texture2D.LoadImage作为Unity纹理加载)。因为我们需要为用户提供一种简单的方法来更改/修改文件,这两种文件都位于hololens的3D Objects文件夹中。
一切正常,直到我们最近不得不将脚本后端从.net更改为il2cpp;从那以后,每当我们尝试读取我们的png文件时,我们都会发现错误,虽然txt仍然可以在我们的.net源代码中没有变化的情况下被重新加载。
我们正在阅读这样的文本文件(正常工作):
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);
...抛出此异常:
抛出异常:Assembly-CSharp.dll中的“System.NullReferenceException”
并且在调用堆栈中只有这个:
在CsvReader.d__4.MoveNext()
因此在我们看来,我们的dataReader保持为null但我们并不真正理解发生了什么,也没有如何防止它。任何人都可以提供一些阅读此类文件的建议或想法吗?
问候!
经过一些工作,我们终于找到了为什么这不起作用......而且令人尴尬。碰巧数组'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后端加载二进制文件,这似乎是一种可靠的方法。