C# Windows应用商店的内部版本中存在WebClient和StreamReader类-Unity中存在内部版本错误

C# Windows应用商店的内部版本中存在WebClient和StreamReader类-Unity中存在内部版本错误,c#,unity3d,windows-store-apps,win-universal-app,hololens,C#,Unity3d,Windows Store Apps,Win Universal App,Hololens,我正在使用Unity为hololens开发一个应用程序,其中我从API下载CSV,然后对其进行解析等。我发现如果您正在构建Windows应用商店应用程序(WSA),您不能使用WebClient类下载CSV,也不能使用StreamReader类解析CSV。我已经能够使用受支持的WWW类替换WebClient。我正试图使用此代码复制我在StreamReader中所做的工作,但效果不太好: var Folder = Windows.ApplicationModel.Package.Curre

我正在使用Unity为hololens开发一个应用程序,其中我从API下载CSV,然后对其进行解析等。我发现如果您正在构建Windows应用商店应用程序(WSA),您不能使用
WebClient
类下载CSV,也不能使用
StreamReader
类解析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);
这是完整的代码。我查看了依赖于平台的编译页面()并添加了预处理器指令,这样我也可以在unity中(在编辑器中)运行脚本,因为WebClient和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 = @"..\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>'.
Assets/Scripts/FinanceFunctions.cs(59,33):错误CS1525:意外符号“Folder”
Assets/Scripts/FinanceFunctions.cs(65,41):错误CS1525:意外符号“Windows”
Assets\Scripts\FinanceFunctions.cs(65,29):错误CS4032:“await”运算符只能在异步方法中使用。考虑用“AsiNC”修饰符标记该方法,并将其返回类型改为“任务”。

如果我理解正确,您需要的是下载.csv并解析它,而无需使用WebClient或StreamReader

对于解析,我将使用如下内容

代码应该是这样的,由MonoBehavior的StartCustomer()调用:

public IEnumerator GetCSVCoroutine(System.Action OnFinished)
{
var downloader=new WWW(“csvurl.com/csvfile.csv”);
返回式下载器;
var fileText=downloader.text;
字符串[,]csvGrid=CSVReader.SplitCsvGrid(fileText);
OnFinished(csvGrid);
}
此外,您还可以使用WWW来代替WWW


我希望这对您有用。

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

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

#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
#如果NETFX#u核心
公共静态字符串读取文件(字符串文件名)
{
var task=LoadFileAsync(文件名);
Task.WaitAll(任务);
返回任务。结果;
}
专用静态异步任务LoadFileAsync(字符串文件名)
{
StorageFile file=Wait ApplicationData.Current.LocalFolder.GetFileAsync(文件名);
返回wait FileIO.ReadTextAsync(文件);
}
#恩迪夫
请注意,您不能在编辑器中使用此函数,因为某些名称空间(如
Windows
e
await
关键字)仅在使用.NET Core library编译时可用,Unity editor环境中当前不可用


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

他们不是在UWP 10中将“文件夹”重命名为“存储文件夹”吗?我认为您的方法调用对于当前的UWP SDK来说是贬值的。如果您想在prj中获取文件,您可以使用AppData.current.LoacalFolder,并且不应该使用
sp500
作为url来获取文件。即使您编译了此代码,您也无法读取安装位置以外的内容(
。\”
尝试从目录结构中转义)。如果要使用
wait
,还需要使用
async
方法-这不是完整的代码示例。
#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