用于Windows应用商店的构建中的WebClient和StreamReader类 - 在Unity中构建错误

时间:2017-03-08 04:59:59

标签: c# unity3d windows-store-apps win-universal-app hololens

我正在使用Unity为hololens开发一个应用程序,我从API下载CSV,然后解析它等。我发现你不能使用WebClient类来下载CSV和{{1如果要构建Windows应用商店应用程序(WSA),则可以解析CSV。我已经能够使用支持的StreamReader类替换WebClient。我正在尝试使用此代码来复制我在StreamReader中所做的事情,但它不能很好地工作:

WWW

这是完整的代码。我查看了平台相关的编译页面(https://docs.unity3d.com/Manual/PlatformDependentCompilation.html)并添加了预处理程序指令,这样我也可以在Unity中运行脚本(在编辑器中),因为支持WebClient和StreamReader并在Unity编辑器中正常工作。有什么建议吗?

var Folder =      Windows.ApplicationModel.Package.Current.InstalledLocation;
var sp500 = @"..\Hololens\Assets\FinanceData\MarketTickers\";
Folder = await Folder.GetFolderAsync(sp500);

// acquire file 
var _File = await Folder.GetFileAsync("sp500.csv");

// read content
var _ReadThis = await Windows.Storage.FileIO.ReadTextAsync(_File);

构建WSA Universal 10 SDK时遇到的错误:

#if !UNITY_WSA_10_0
        using (var reader = new StreamReader(file))
        {
            while (!reader.EndOfStream)
            {
                var csvLine = reader.ReadLine();
                var firstCommaIndex = csvLine.IndexOf(",");
                var stock = csvLine.Substring(0, firstCommaIndex);

               // In case there are symbols in the stock names that would not be recognized by Yahoo API
                if (!tickers.Contains(stock) && !stock.Contains('/'))
                {
                    tickers.Add(stock);
                }
            }
         }
#else
        var Folder =      Windows.ApplicationModel.Package.Current.InstalledLocation;
        var sp500 = @"..\Hololens\Assets\FinanceData\MarketTickers\";
        Folder = await Folder.GetFolderAsync(sp500);

        // acquire file 
        var _File = await Folder.GetFileAsync("sp500.csv");

        // read content
        var _ReadThis = await Windows.Storage.FileIO.ReadTextAsync(_File);
#endif 

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你想要的是下载一个.csv并解析它而不使用WebClient或StreamReader。

对于解析,我会使用类似CSVReader

的内容

代码将是由MonoBehaviour的StartCoroutine()调用的代码:

public IEnumerator GetCSVCoroutine(System.Action<string[,]> OnFinished)
{
    var downloader = new WWW("csvurl.com/csvfile.csv");
    yield return downloader;
    var fileText = downloader.text;
    string[,] csvGrid = CSVReader.SplitCsvGrid(fileText);
    OnFinished(csvGrid);
}

此外,您还可以使用UnityWebRequest

代替WWW

我希望这对你有用。

答案 1 :(得分:0)

如果您想使用StreamReader Unity3D,您可以使用WinRTLegacy命名空间。这应包含System.IO.StreamReader的旧版本。

实施此方法的最佳方法是在使用部分

中添加此内容
#if NETFX_CORE
using StreamReader = WinRTLegacy.IO.StreamReader;
#else
using StreamReader = System.IO.StreamReader;
#endif

然后你可以像往常一样继续使用它。

#if NETFX_CORE是绝对必要的,因为编辑器中当前没有基于.NET Core的命名空间。 这是一个令人讨厌的问题,因为您只能在构建时测试代码,因为这是实际.NET Core API涉及的唯一阶段。

编辑: 我刚刚意识到你有一个完全不同的问题。 这是适合您的正确解决方案:

#if NETFX_CORE
        public static string ReadFile(string filename)
        {
            var task = LoadFileAsync(filename);

            Task.WaitAll(task);

            return task.Result;
        }

        private static async Task<string> LoadFileAsync(string filename)
        {
            StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);

            return await FileIO.ReadTextAsync(file);
        }
#endif

请注意,您不能在编辑器中使用此函数,因为某些名称空间(例如Windowsawait关键字仅在使用.NET Core库编译时才可用,该库目前在Unity中不可用编辑环境。

根据您是在UWP构建还是在任何其他环境中,让相同的函数使用不同的实现可能会更好。