【问题标题】:Xamarin bundle referenced .net standard project contentXamarin 捆绑包引用了 .net 标准项目内容
【发布时间】:2019-09-03 23:30:36
【问题描述】:

我有一个 Xamarin iOS 应用程序。 iOS 应用程序引用了另一个项目,即 .NET Standard 项目。这个项目构建了一些资源(汇编输出可以忽略不计)。这些资源是 .NET Standard 中的内容。 iOS 应用程序引用了这个 .NET Standard 库。

构建 iOS 应用程序时,.ipa 文件不包含引用程序集的内容。

我尝试了各种方法,例如破解 BundleResource 以包含文件路径,但效果不佳,因为我无法获得新的 <ProjectReference> 格式来为我提供输出内容的文件路径,而只是程序集。

如何将 .NET Standard 程序集中的内容捆绑到我的 iOS 应用程序中?

【问题讨论】:

  • 您是否尝试过将它们作为 BundledResources 包含在内?
  • 您需要将这些资源包含为“嵌入式资源”,并在运行时通过 GetManifestResourceStream 从程序集中读取它们
  • @Jason 有点棘手,因为它们不能成为原始项目中的 BundleResource,因为它不是 iOS 项目。我已经尝试了一些 MSBuild-fu 将它们转换为 iOS 项目构建中的 BundleResource,但无法使其正常工作。
  • @SushiHangover 我研究了这个解决方案,但我使用的 API 确实需要磁盘上的文件。
  • @Puppy 您需要将这些文件移动到 Xamarin.iOS 项目(基于库或应用程序)并将它们标记为捆绑资源或将它们从嵌入它们的程序集中复制出来(即到 iOS 应用程序缓存目录等,然后将它们用作“普通”文件)。就我个人而言,由于运行时性能因素(持续的内存膨胀等),我避免使用嵌入式资源,并且始终更喜欢在移动应用程序结构中使用本机捆绑功能。

标签: ios xamarin .net-standard


【解决方案1】:

例如,如果MyClass 是一个类,MyContent.txt 是一个具有属性构建操作Embeddeded resource 的文本文件,两者都在 .NET 标准程序集MyAssembly.NETStandard 中,在 iOS 程序集(iOS 应用程序)中:

var assembly = typeof(MyClass).GetTypeInfo().Assembly;
var filename = "MyAssembly.NETStandard.MyContent.txt";
var stream = assembly.GetManifestResourceStream(filename);
var text = "";
using (var reader = new System.IO.StreamReader(stream)) {
    text = reader.ReadToEnd();
}

必须在 iOS 程序集中引用 .NET Standard 程序集 MyAssembly.NETStandard

另见Loading Files Embedded as Resources

【讨论】:

  • 不幸的是,我使用的 API 确实需要磁盘上的文件。也许可以说服它接受流,但这可能......很尴尬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2017-09-23
  • 2018-08-25
相关资源
最近更新 更多