Unity и Hololens: чтение исключений из нетекстовых файлов - PullRequest
0 голосов
/ 28 января 2019

[Отредактировано] Сначала я должен извиниться, я только что заметил фрагмент кода, который я вставил, поскольку наш код для чтения файлов PNG не также работает в бэкэнде .net (txtчтение работает как для .net, так и для il2cpp, как указано).Стек вызовов пришел из другого исключения.Исправлено

Мы работаем в приложении XR для Microsoft Hololens, которое включает чтение как текстовых, так и двоичных файлов (последний как байтовые массивы для загрузки в качестве текстур Unity с помощью Texture2D.LoadImage).Поскольку мы должны предоставить пользователю простой способ изменения / модификации файлов, оба находятся в папке 3D Objects в hololens.

Все работало должным образом, пока нам недавно не пришлось сменить наш серверный сценарий.net to 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);

..., которое выдает это исключение:

Возникло исключение: 'System.NullReferenceException' в Assembly-CSharp.dll

и иметь только это в стеке вызовов:

в CsvReader.d__4.MoveNext ()

Так что нам кажется, что наш dataReader остается нулевымно мы не очень понимаем, что происходит, и как это предотвратить.Кто-нибудь может дать какой-нибудь совет или идеи для чтения такого файла?

regards!

1 Ответ

0 голосов
/ 29 января 2019

После некоторой дополнительной работы мы наконец нашли, почему это не работает ... и это смущает.Бывает, что массив 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, это кажется надежным подходом.

...