Xamarin Forms发布问题:Mono.Linker.MarkException: 错误处理方法:'System.String Microsoft.Net.Http.Headers.DateTimeFormatter

Xamarin Forms Release Problem: Mono.Linker.MarkException: Error processing method: 'System.String Microsoft.Net.Http.Headers.DateTimeFormatter

我对 xamarin 有点陌生。当我从调试模式切换到发布模式时出现此错误,我到处搜索但没有得到答案。

Severity    Code    Description Project File    Line    Suppression State
Error       Mono.Linker.MarkException: Error processing method: 'System.String Microsoft.Net.Http.Headers.DateTimeFormatter::ToRfc1123String(System.DateTimeOffset,System.Boolean)' in assembly: 'Microsoft.Net.Http.Headers.dll' ---> Mono.Cecil.ResolutionException: Failed to resolve Microsoft.Extensions.Primitives.InplaceStringBuilder
   at Mono.Linker.Steps.MarkStep.HandleUnresolvedType(TypeReference reference)
   at Mono.Linker.Steps.MarkStep.MarkType(TypeReference reference)
   at MonoDroid.Tuner.MonoDroidMarkStep.MarkType(TypeReference reference)
   at Mono.Linker.Steps.MarkStep.MarkMethodBody(MethodBody body)
   at Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition method)
   at Mono.Linker.Steps.MarkStep.ProcessQueue()
   --- End of inner exception stack trace ---
   at Mono.Linker.Steps.MarkStep.ProcessQueue()
   at Mono.Linker.Steps.MarkStep.ProcessPrimaryQueue()
   at Mono.Linker.Steps.MarkStep.Process()
   at Mono.Linker.Steps.MarkStep.Process(LinkContext context)
   at MonoDroid.Tuner.MonoDroidMarkStep.Process(LinkContext context)
   at Mono.Linker.Pipeline.ProcessStep(LinkContext context, IStep step)
   at Mono.Linker.Pipeline.Process(LinkContext context)
   at MonoDroid.Tuner.Linker.Process(LinkerOptions options, ILogger logger, LinkContext& context)
   at Xamarin.Android.Tasks.LinkAssemblies.Execute(DirectoryAssemblyResolver res)
       at Xamarin.Android.Tasks.LinkAssemblies.RunTask()
       at Microsoft.Android.Build.Tasks.AndroidTask.Execute() in /Users/builder/azdo/_work/1/s/xamarin-android/external/xamarin-android-tools/src/Microsoft.Android.Build.BaseTasks/AndroidTask.cs:line 17"     
    

关闭链接是懒惰的答案。使用链接器的要点是删除“死”代码并最小化程序的大小。移动应用程序的大小对许多用户来说更为重要。

Xamarin.Android 中使用的链接器将删除它认为您没有使用的代码。使用反射时尤其如此。要解决此问题,您需要告诉编译器您正在使用该类型。

一种流行的解决方案是使用 LinkerPleaseInclude.cs 文件并使用类型和属性创建存根方法,以便编译器认为您正在使用它们。您会在 Internet 上找到很多示例。

public class LinkerPleaseInclude
{
  public void KeepInplaceStringBuilder(Microsoft.Extensions.Primitives.InplaceStringBuilder x)
  {
    x.Append('x'); // This will keep the InplaceStringBuilder.Append method from being linked out...
  }
}

一种较新的解决方案是使用 Custom Linker Configuration XML file。与 LinkerPleaseInclude.cs 解决方案相比,这有点“黑客”,但更冗长。它允许您保留整个类型、特定方法、属性等。

<linker>
        <assembly fullname="Microsoft.Net.Http.Headers">
                <type fullname="Microsoft.Extensions.Primitives.InplaceStringBuilder">
        </assembly>
</linker>

这两种解决方案都行得通。对链接器抱怨的每种类型继续这样做,它最终会起作用。

Trevor 的回答对我有用,但还有其他解决方案。

我注意到这个缺失的 class Microsoft.Extensions.Primitives.DateTimeFormatter 已从 4.0 版的 Microsoft.Extensions.Primitives dll 中删除。我的项目的一些依赖项需要版本 >=3.2 和一些 >=5.0。我猜 linker 选择了 link 更高的 5.0 版本,所以其他依赖项找不到删除 class。

解决方案是更新所有依赖项,以便它们的依赖项使用 Microsoft.Extensions.Primitives >=5.0

的版本