Windows Store构建中的WebClient和StreamReader类 - Unity构建错误



我正在使用Unity为HoloLens开发一个应用程序,其中我从API下载CSV,然后对其进行解析等。我发现您无法使用WebClient类下载CSV和如果您要构建Windows Store应用程序(WSA),则StreamReader类可以解析CSV。我已经能够使用支持的WWW类替换网络电量。我正在尝试使用此代码来复制我在StreamReader中所做的工作,但它的效果不佳:

var Folder =      Windows.ApplicationModel.Package.Current.InstalledLocation;
var sp500 = @"..HololensAssetsFinanceDataMarketTickers";
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/platformdepperententcompilation.html),并添加了Preprocessor指令,因此我也可以在编辑器中(在编辑器中)运行脚本(自网络网络上)和StreamReader自此提供了支持。并在Unity编辑器中正常工作。有什么建议吗?

#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 = @"..HololensAssetsFinanceDataMarketTickers";
        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'
AssetsScriptsFinanceFunctions.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>'.

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

我希望这对您有用。

如果要使用StreamReader Unity3D,则有机会使用winrtlegacy名称空间。这应该包含 System.IO.StreamReader的旧版。

实现的最佳方法是使用 pection

在您的中添加此方法
#if NETFX_CORE
using StreamReader = WinRTLegacy.IO.StreamReader;
#else
using StreamReader = System.IO.StreamReader;
#endif

您可以像往常一样继续使用它。

#if NETFX_CORE是绝对必要的,因为编辑器中当前没有一个基于.NET Core的名称空间。这是一个滋扰,因为您只能在构建时测试代码,因为这是实际的.NET核心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

请注意,您不能在编辑器中使用此函数,因为Windows e之类的某些名称空间await关键字仅在使用.NET Core库进行编译时可用,该库当前在Unity编辑器环境中不可用。

>

拥有相同函数可能会使用不同的实现在您是在UWP构建还是任何其他环境的基础上。

最新更新