【问题标题】:Read file in Shared Library Xamarin c#在共享库 Xamarin c# 中读取文件
【发布时间】:2018-07-20 15:28:29
【问题描述】:

我在共享库中保存了一些 .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 确实有效。

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

【问题讨论】:

    标签: c# xamarin


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

    2. 在您的 Android 项目中,创建一个 链接,指向 Assets 中构建类型为 AndroidAsset 的文件。

    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>
    

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

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

    Xamarin.Essentials

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

    【讨论】:

    • 猜猜唯一的方法是手动更改项目文件。我希望有一种更本土的方法。但我想你的解决方案是最接近答案的!
    • @GustavoBaiocchiCosta ...hoping for a more native approach... 不知道你的意思是什么,原生于什么?此外,您不必手动更改 .csproj,您可以通过拖放来完成此操作
    • 我明天再试一次@SushiHangover。
    • 我今天又试了一次你的方法。当我将文件放到 PCL 项目中时,没有创建链接的选项。 Xamarin.Essentials 是我们没有使用的 xamarin.forms。我仍在尝试通过android方式获取流。但是,我得到了 Jave.IO.FileNotFoundException
    • @GustavoBaiocchiCosta 您首先将文件添加到 NetStd/PCL 项目,然后打开 FileExplorer/Finder 并将该文件拖放到 Android/iOS 项目中,然后您可以选择复制、移动或链接...选择链接,结果是我的答案中显示的.csproj添加。
    【解决方案2】:

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

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

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

    对于 Android,文件位于 Assets 中,构建类型为 AndroidAsset,并使用 Assets.Open 访问它们。

    This page 为您提供更多详细信息。

    【讨论】:

    • 是的,它们是静态的。也许有一种方法可以将它们存储在共享库中。它适用于 iOS,但不适用于 android
    【解决方案3】:

    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>
    

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 2010-09-13
      • 2011-09-07
      • 2019-04-30
      • 2014-06-15
      • 2018-12-28
      • 1970-01-01
      • 2013-02-21
      相关资源
      最近更新 更多