【问题标题】:WebClient and StreamReader Class in build for Windows Store - Build Errors in Unity为 Windows 应用商店构建的 WebClient 和 StreamReader 类 - Unity 中的构建错误
【发布时间】:2017-03-08 04:59:58
【问题描述】:

我正在使用 Unity 开发一个用于 hololens 的应用程序,在该应用程序中我从 API 下载 CSV,然后对其进行解析等。我发现您不能使用 WebClient 类来下载 CSV 和 StreamReader 类来下载如果您正在构建 Windows 应用商店应用程序 (WSA),请解析 CSV。我已经能够通过使用受支持的WWW 类来替换 WebClient。我正在尝试使用此代码来复制我在 StreamReader 中所做的事情,但效果不佳:

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);

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

#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 

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

Assets/Scripts/FinanceFunctions.cs(59,33): error CS1525: Unexpected symbol `Folder'
Assets/Scripts/FinanceFunctions.cs(65,41): error CS1525: Unexpected symbol `Windows'
Assets\Scripts\FinanceFunctions.cs(65,29): error CS4032: The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task<string>'.

【问题讨论】:

  • 他们不是在 UWP 10 中将“Folder”重命名为“StorageFolder”吗?我认为你的方法调用对于当前的 UWP SDK 来说是贬值的。
  • 如果你想在prj中获取文件,你可以使用AppData.Current.LoacalFolder并且你不应该使用sp500 作为url来获取文件。
  • 即使你编译了这段代码,你也不能在你安装的位置之外读取("..\"试图逃出你的目录结构)。如果你想使用await,你还需要有一个async 方法——这不是整个代码示例。

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


【解决方案1】:

如果我理解正确,您想要的是下载 .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

希望对你有用。

【讨论】:

    【解决方案2】:

    如果您想使用 StreamReader,Unity3D 让您有机会使用WinRTLegacy 命名空间。这应该包含System.IO.StreamReader 的旧版本。

    实现这一点的最佳方法是将其添加到您的 using 部分

    #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 构建还是任何其他环境中,让相同的函数使用不同的实现可能会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2015-12-20
      相关资源
      最近更新 更多