繁体   English   中英

读取共享库中的文件 Xamarin c#

[英]Read file in Shared Library Xamarin c#

我在共享库中保存了一些.json 文件。

我设法通过代码在 iOS 中阅读得很好

string fileName = $"Files/file_name.json";

var path = Path.Combine(NSBundle.MainBundle.BundlePath, fileName);
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
using (var streaReader = new StreamReader(stream))
{
    return streaReader.ReadToEnd();
}

但是,我一直在努力为 Android 做同样的事情。我无法从资产中读取,因为它在共享库中。

using (var stream = Application.Context.Assets.Open("Files/file_name.json))

如果我在资产文件夹下的 Android 项目中有文件,那么使用上面的 live 确实有效。

我想保留一份用于两个平台的文件副本。

  1. 将“共享”文件添加到解决方案中(在PCL / NetStd / Shared项目内的文件夹中就可以了,只需将构建类型设置为None )。

  2. 在您的Android项目中,使用构建类型AndroidAssetAssets创建文件的链接

  3. 在您的iOS项目中,使用构建类型为BundleResource创建指向文件的链接

Android示例:

  <ItemGroup>
    <AndroidAsset Include="..\Forms_30\her.png">
      <Link>Assets\her.png</Link>
    </AndroidAsset>
  </ItemGroup>

iOS示例:

  <ItemGroup>
    <BundleResource Include="..\Forms_30\her.png">
      <Link>her.png</Link>
    </BundleResource>
 </ItemGroup>

注意:您可以使用PCL / NetStd库中文件的起始位置来手动编辑.csproj或从Finder / Explorer中执行拖放操作,但是可以在拖放文件时选择创建链接

现在,您可以通过DI使用自己的平台相关代码,也可以使用Xamarin.Essentials从PCL / NetStd库访问这些只读的应用程序捆绑文件。

Xamarin.Essentials

using (var stream = await FileSystem.OpenAppPackageFileAsync("her.png"))
{
     ~~~
}

这些文件是静态文件(例如,它们是安装包的一部分),还是由应用程序在运行时保存?

如果它们是静态的,则需要根据平台将它们放置在不同的位置。

对于iOS,您将文件放入构建类型为BundleResource Resources ,并使用NSBundle.MainBundle.PathForResource访问它们。

对于Android,文件进入构建类型为AndroidAsset ,并通过Assets.Open访问它们。

此页面为您提供更多详细信息。

VS工程文件中的AndroidAssets、Content等命令标签可以使用通配符,可以动态使用。

下面的命令适用于 VS 2019 中的 xamarin.android 项目,并将向您的项目添加给定基本路径内的所有目录和文件。 加载项目时,文件将动态包含到 /Assets 中,然后 VS 将显示正常包含为资产。 部署以正确的方式将它们作为资产添加到您的 apk 中。

以同样的方式,您可以使用 AndroidResource 标签等将它们作为资源包含在内。

请注意,对于 CORE、较旧的 .NET 变体或共享库,“include”、“copyto”和“link”属性的格式和/或名称是不同的。 你必须仔细检查。

对于某些 CORE 版本,它是“LinkBase=...”而不是“Link=”等等。 您最好仔细检查并从 Microsoft 文档中获取正确的格式。

  <ItemGroup>
    <AndroidAsset Include="PATH_TO_THE_SHARED_LIB\FOLDER_TO_INCLUDE\**" CopyToPublishDirectory="Always" Link="Assets\%(RecursiveDir)\%(Filename)%(Extension)" />
 </ItemGroup>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM