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
的版本
我对 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
的版本