如何读取共享 Xamarin 项目中的文件?

How to read a file in a shared Xamarin project?

我正在为我的 Xamarin 应用程序使用 MvvmCross,所以我有 3 个项目:MyProject.CoreMyProject.DroidMyProject.Touch

我在 MyProject.Core 项目中有 file.txt。我希望能够从 MyProject.Core 中的代码打开并读取 file.txt,以便它可以在两个平台上使用。听起来很简单,但我不知道怎么做。我找到了 2 种方法,但我认为它们对我不起作用:

1) 我将 file.txt 设为嵌入式资源,并在运行时通过反射读取它。但我不认为我可以在 PCL.

中做到这一点

2) 我将 file.txt 设置为 "Copy to output directory",但这也不起作用,因为生成的包(.ipa 或 .apk)一旦在phone(对吗?)

编辑

我只是想到了一个可以满足我的情况的解决方案:

  1. file.txt 添加到 MyProject.Core
  2. 在 iOS 项目中,在 Resources 文件夹中添加与 LINK 相同的文件。
  3. 在 Android 项目中,在 values 文件夹中添加与 LINK 相同的文件。

虽然我仍然无法从MyProject.Core访问file.txt,但我可以从每个平台访问相同的文件,这足以解决我的情况。我会把问题留在这里,以防有人对需要它的其他人有这个特定场景的答案。

如果您的核心项目类型是 NET Standard 项目,您可以使用标准 System.IO 类 来获取文件系统。

如果它是 PCL(您可能想要升级它),您可以使用 MvvmCross 文件插件访问文件系统或 PCLStorage nuget。随你喜欢。

使用前者,您可以将 MvvmCross.Plugins.File nuget 添加到核心和两个应用程序项目中。然后,您可以在要注入的 ViewModel 或服务的构造函数中添加 IMvxFileStore 。然后开始使用该接口上的任何方法对文件系统进行操作。

但是,对于 PCL 中的嵌入式资源,您可以执行以下操作:

var assembly = typeof(SomeTypeInYourPCL).Assembly;
// some older PCL profiles you need to call .GetTypeInfo() before .Assembly
var stream = assembly.GetManifestResourceStream("whatever.txt");