Проблема с выпуском форм Xamarin: Mono.Линкер.Исключение MarkException: Метод обработки ошибок: «Система.Строка Microsoft.Net.Http.Заголовки.Форматирование даты и времени

#xamarin.forms #xamarin.android

Вопрос:

Я вроде как новичок в 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, LinkContextamp; 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"     
    
 

Комментарии:

1. установите «Связь» на «Нет».

Ответ №1:

Отключение связи-это ленивый ответ. Смысл использования компоновщика состоит в том, чтобы удалить «мертвый» код и минимизировать размер программы. Размер мобильного приложения более важен для многих пользователей.

Компоновщик, используемый в Xamarin.Android собирается удалить код, который, по его мнению, вы не используете. Это особенно верно при использовании отражения. Чтобы исправить это, вам нужно будет сообщить компилятору, что вы используете тип.

Популярным решением является использование LinkerPleaseInclude.cs файла и создание методов-заглушек с использованием типа и свойств, чтобы компилятор думал, что вы их используете. Вы найдете много примеров в Интернете.

 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...
  }
}
 

Более новым решением является использование XML-файла конфигурации пользовательского компоновщика. Это немного меньше похоже на «взлом», чем LinkerPleaseInclude.cs решение, но более подробное. Это позволяет сохранить весь тип, конкретные методы, свойства и т.д.

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

Любое решение будет работать. Просто продолжайте делать это для каждого из типов, на которые жалуется компоновщик, и в конечном итоге это сработает.