【问题标题】:Why does adding System.Memory reference break my iOS project?为什么添加 System.Memory 引用会破坏我的 iOS 项目?
【发布时间】:2022-01-04 02:44:01
【问题描述】:

总结

我有一个包含两个项目的解决方案:一个 .NET Standard 和一个引用 .NET Standard 项目的 iOS 项目。

如果 .NET Standard 不引用 System.Memory nuget 包(特别是 4.5.3 或 4.5.4 版本),则一切正常。如果我在 .NET Standard 项目中添加对 System.Memory 的引用,那么我的 iOS 项目会因 MissingMethodException 而崩溃。

注意:此问题仅适用于 iOS,不会在 Xamarin Android 上重现。

我该如何解决这个问题?

详情

我的项目正在使用 TopTen.RichTextKit 库 (https://www.nuget.org/packages/Topten.RichTextKit/) 来执行文本块测量。当我在 iOS 上运行代码时,调用 TextBlock.MeasuredHeight 时出现以下崩溃:

System.InvalidOperationException: 'Exception in BuildFontRuns() with original length of 11 now 11, style run count 1, font run count 0, direction overrides: False'

这有一个内部异常:

Method not found: void SkiaSharp.SKFont.GetGlyphs(System.ReadOnlySpan`1<int>,System.Span`1<uint16>)

通过一一删除nuget包并使用测试项目,我发现如果我在我的.NET Standard项目中引用System.Memory 4.5.4版,就会出现错误。如果我删除此版本,崩溃就会消失。

此外,不同版本的 System.Memory 会导致不同的行为:

  • 4.5.0 - 工作
  • 4.5.1 - 不会编译
  • 4.5.2 - 不会编译
  • 4.5.3 - 崩溃
  • 4.5.4 - 崩溃

很遗憾,我无法降级到 System.Memory 4.5.0,因为其他库需要版本 >= 4.5.4。

我不完全理解解释,但我发现一些链接表明 System.Memory 的 iOS 实现不完整。例如:

这意味着 Xamarin 项目现在依赖于 NuGet 包中的实现。 System.Memory NuGet 包版本 4.5.1 相应地不包含 Xamarin 项目类型的占位符文件。

"Can not resolve reference: `System.Memory`" or "Could not find `System.Memory`" after update to Visual Studio 2017 version 15.8 Preview

【问题讨论】:

标签: c# xamarin.ios nuget


【解决方案1】:

我找到了一种解决方法 - 通过在我的 iOS 项目中引用 System.Memory 版本 4.5.0(特别是此版本),我的项目运行。我可以继续在我的 .NET Standard 项目中引用 System.Memory 4.5.4,因此唯一需要的更改是在 iOS 项目中。

请注意,这意味着我的解决方案引用了 System.Memory 的混合版本,我认为不建议这样做。但是,在这种情况下,这是我能找到的唯一解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2017-01-31
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多