[英]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 确实有效。
我想保留一份用于两个平台的文件副本。
将“共享”文件添加到解决方案中(在PCL / NetStd / Shared项目内的文件夹中就可以了,只需将构建类型设置为None
)。
在您的Android项目中,使用构建类型AndroidAsset
在Assets
创建文件的链接 。
BundleResource
创建指向文件的链接 。 <ItemGroup>
<AndroidAsset Include="..\Forms_30\her.png">
<Link>Assets\her.png</Link>
</AndroidAsset>
</ItemGroup>
<ItemGroup>
<BundleResource Include="..\Forms_30\her.png">
<Link>her.png</Link>
</BundleResource>
</ItemGroup>
注意:您可以使用PCL / NetStd库中文件的起始位置来手动编辑.csproj
或从Finder / Explorer中执行拖放操作,但是可以在拖放文件时选择创建链接 。
现在,您可以通过DI使用自己的平台相关代码,也可以使用Xamarin.Essentials
从PCL / NetStd库访问这些只读的应用程序捆绑文件。
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.