如何读取共享 Xamarin 项目中的文件?
How to read a file in a shared Xamarin project?
我正在为我的 Xamarin 应用程序使用 MvvmCross,所以我有 3 个项目:MyProject.Core
、MyProject.Droid
和 MyProject.Touch
我在 MyProject.Core
项目中有 file.txt
。我希望能够从 MyProject.Core
中的代码打开并读取 file.txt
,以便它可以在两个平台上使用。听起来很简单,但我不知道怎么做。我找到了 2 种方法,但我认为它们对我不起作用:
1) 我将 file.txt
设为嵌入式资源,并在运行时通过反射读取它。但我不认为我可以在 PCL.
中做到这一点
2) 我将 file.txt
设置为 "Copy to output directory",但这也不起作用,因为生成的包(.ipa 或 .apk)一旦在phone(对吗?)
编辑
我只是想到了一个可以满足我的情况的解决方案:
- 将
file.txt
添加到 MyProject.Core
- 在 iOS 项目中,在
Resources
文件夹中添加与 LINK 相同的文件。
- 在 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");
我正在为我的 Xamarin 应用程序使用 MvvmCross,所以我有 3 个项目:MyProject.Core
、MyProject.Droid
和 MyProject.Touch
我在 MyProject.Core
项目中有 file.txt
。我希望能够从 MyProject.Core
中的代码打开并读取 file.txt
,以便它可以在两个平台上使用。听起来很简单,但我不知道怎么做。我找到了 2 种方法,但我认为它们对我不起作用:
1) 我将 file.txt
设为嵌入式资源,并在运行时通过反射读取它。但我不认为我可以在 PCL.
2) 我将 file.txt
设置为 "Copy to output directory",但这也不起作用,因为生成的包(.ipa 或 .apk)一旦在phone(对吗?)
编辑
我只是想到了一个可以满足我的情况的解决方案:
- 将
file.txt
添加到MyProject.Core
- 在 iOS 项目中,在
Resources
文件夹中添加与 LINK 相同的文件。 - 在 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");