簡體   English   中英

Windows Store構建中的WebClient和StreamReader類-Unity中的構建錯誤

[英]WebClient and StreamReader Class in build for Windows Store - Build Errors in Unity

我正在使用Unity開發用於Hololens的應用程序,其中我從API下載CSV,然后進行解析等。我發現,如果要構建,則無法使用WebClient類下載CSV和StreamReader類來解析CSV Windows應用商店(WSA)。 我已經能夠通過使用支持的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>'.

如果我正確理解您的意思,那么您想要下載一個.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);
}

另外, 除了 WWW,您還可以使用UnityWebRequest

我希望這對您有用。

如果要使用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

請注意,您無法在編輯器中使用此功能,因為某些命名空間(例如Windows e) await關鍵字僅在使用.NET Core庫進行編譯時才可用,而該庫在Unity Editor環境中當前不可用。

根據您是在UWP構建還是在任何其他環境下,使相同的功能使用不同的實現可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM