为什么添加 System.Memory 引用会破坏我的 iOS 项目?
Why does adding System.Memory reference break my iOS project?
总结
我有一个包含两个项目的解决方案:一个 .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 实现不完整。例如:
This means that Xamarin projects now depend on the implementations from the NuGet package instead. And the System.Memory NuGet package version 4.5.1 accordingly does not include placeholder files for Xamarin project types.
"Can not resolve reference: `System.Memory`" or "Could not find `System.Memory`" after update to Visual Studio 2017 version 15.8 Preview
我找到了一个解决方法 - 通过在我的 iOS 项目中引用 System.Memory 版本 4.5.0(特别是这个版本),我的项目运行。我可以继续在我的 .NET Standard 项目中引用 System.Memory 4.5.4,因此唯一需要更改的是 iOS 项目。
请注意,这意味着我的解决方案引用了 System.Memory 的混合版本,我认为不推荐这样做。但是,在这种情况下,这是我能找到的解决此问题的唯一方法。
总结
我有一个包含两个项目的解决方案:一个 .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 实现不完整。例如:
This means that Xamarin projects now depend on the implementations from the NuGet package instead. And the System.Memory NuGet package version 4.5.1 accordingly does not include placeholder files for Xamarin project types.
"Can not resolve reference: `System.Memory`" or "Could not find `System.Memory`" after update to Visual Studio 2017 version 15.8 Preview
我找到了一个解决方法 - 通过在我的 iOS 项目中引用 System.Memory 版本 4.5.0(特别是这个版本),我的项目运行。我可以继续在我的 .NET Standard 项目中引用 System.Memory 4.5.4,因此唯一需要更改的是 iOS 项目。
请注意,这意味着我的解决方案引用了 System.Memory 的混合版本,我认为不推荐这样做。但是,在这种情况下,这是我能找到的解决此问题的唯一方法。