NameResolutionFailure с приложением Azure Storage Unity UWP (работает в проигрывателе) - PullRequest
0 голосов
/ 29 октября 2018

У меня есть приложение Hololens, которое должно загружать данные из хранилища Azure. При использовании пакета WindowsAzure.Storage, преобразованного в пакет UnityPack , я могу загружать данные при использовании Unity Player, а при тестировании с обычным приложением 2D XAML UWP я также могу загружать данные с помощью этого API на Hololens, однако при отладке проекта IL2CPP я получаю «WebException: Error: NameResolutionFailure» ( полный журнал ).

Вот шаги для создания проекта упрощенного тестирования:

  • Open Unity 2018.2 (я использую 2018.2.14f, 2018.2 необходим для использования https, который, по-видимому, необходим для подключения к Azure)
  • Установите для версии .NET Unity Project значение 4.x, поскольку API хранилища Azure использует await / async, в качестве внутреннего интерфейса я использовал IL2CPP. Серверная часть .NET выдает ошибки о том, что некоторые функции Newtonsoft.JSON не найдены, что может быть причиной проблем? Assets / Plugins / Newtonsoft.Json.dll существует и ссылается на .NET v4.0.30319.

Ошибка: метод System.Threading.Tasks.Task 1 Newtonsoft.Json.Linq.JObject :: LoadAsync (Newtonsoft.Json.JsonReader, System.Threading.CancellationToken) ` не существует в целевой структуре. Ссылка от Microsoft.WindowsAzure.Storage.dll в System.Void Microsoft.WindowsAzure.Storage.ODataErrorHelper / d__2 :: MoveNext ().

  • Создать пустой игровой объект с именем ImageGrid в (0, 0, 2)
  • Импортируйте нижеприведенный скрипт PopulateImageGrid.cs в проект и присоедините его к ImageGrid
  • Создание префаба из куба 1 * 1 * 0.1 и установка открытого поля Image Grid Плитка игрового объекта Image Grid на этот префаб
  • Удалить активы / плагины / Microsoft.CSharp.dll, поскольку Unity жалуется на то, что он существует дважды
  • Сборка как UWP, загрузка собранного проекта в Visual Studio и запуск с выбранной версией и x86 (или развертывание в Hololens)

Вот это PopulateImageGrid.cs. Не стесняйтесь связываться с данными учетной записи, приведенными в коде, поскольку это бесплатная учетная запись без конфиденциальных данных.

using System.Collections;
using System.Collections.Generic;
// using UnityEditor.PackageManager;
using UnityEngine;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.File;
using System;

public class PopulateImageGrid : MonoBehaviour {

    public Transform ImageGridTile;

    async void Start()
    {
        Debug.Log("In PopulateImageGrid.Start()");
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(@"DefaultEndpointsProtocol=https;FileEndpoint=https://meshiconstorage.file.core.windows.net;AccountName=meshiconstorage;AccountKey=2Myeg/WUowehkrAY8Lgl361xxylfkMdITrVapKKVPyo9bVFqN6/uD1S66CB4oTPnnWncLubiVjioBUIT+4utaw==");
        CloudFileClient cloudFileClient = storageAccount.CreateCloudFileClient();
        string shareName = "meshicon-share1";
        var cloudFileShare = cloudFileClient.GetShareReference(shareName);
        CloudFileDirectory rootDirectory = cloudFileShare.GetRootDirectoryReference();
        var fileDirectory = rootDirectory.GetDirectoryReference("images");

        FileContinuationToken token = null;

        int row = 0;
        int col = 0;
        const int width = 32;
        const int height = 32;
        do
        {
            FileResultSegment frs = await fileDirectory.ListFilesAndDirectoriesSegmentedAsync(token);
            foreach (var result in frs.Results)
            {
                Debug.Log("In loop with " + result.ToString());
                Vector3 position = new Vector3(col++ * 0.13f - 0.39f, row * 0.13f - 0.26f, 0f);
                Quaternion rotation = Quaternion.identity;
                Transform gridTile = Instantiate(ImageGridTile);
                gridTile.transform.parent = gameObject.transform;
                gridTile.localPosition = position;
                gridTile.localRotation = rotation;
                if (col > 6)
                {
                    row++;
                    col = 0;
                }
                byte[] imgData = new byte[10000];
                int size = await ((CloudFile)result).DownloadToByteArrayAsync(imgData, 0);
                Debug.Log("Downloaded to byte[]");
                Texture2D texture = new Texture2D(width, height);
                byte[] realImgData = new byte[size];
                Array.Copy(imgData, realImgData, size);
                texture.LoadImage(imgData);
                gridTile.GetComponent<MeshRenderer>().material.mainTexture = texture;
            }
        } while (token != null);
    }
}

1 Ответ

0 голосов
/ 02 ноября 2018

Хитрость заключалась в том, чтобы подождать, пока по истечении 30-секундного тайм-аута появится сообщение об ошибке NameResolutionFailure, что сделало для меня очевидным, что я должен активировать интернет-разрешения в appxmanifest.

...