我构建了完整的Xamarin From应用程序。当我将构建模式更改为Release
时,出现以下错误消息:
严重性代码说明项目文件行抑制状态
错误“ LinkAssemblies”任务意外失败。
Mono.Linker.MarkException:错误处理方法:'System.Void
Microsoft.Extensions.Primitives.InplaceStringBuilder :: Append(System.String,System.Int32,System.Int32)'
在汇编中:'Microsoft.Extensions.Primitives.dll'--->
Mono.Cecil.ResolutionException:无法解析System.Void
System.Runtime.CompilerServices.Unsafe :: CopyBlockUnaligned(System.Void *,System.Void *,System.UInt32)
在Mono.Linker.Steps.MarkStep.HandleUnresolvedMethod(MethodReference
参考),位于Mono.Linker.Steps.MarkStep.MarkMethod(MethodReference
参考)
Mono.Linker.Steps.MarkStep.MarkInstruction(指令说明)
在Mono.Linker.Steps.MarkStep.MarkMethodBody(MethodBody body)处
Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition方法)
在Mono.Linker.Steps.MarkStep.ProcessQueue()-内部结束
异常堆栈跟踪---
Mono.Linker.Steps.MarkStep.ProcessQueue()在
Mono.Linker.Steps.MarkStep.ProcessEntireQueue()在
的Mono.Linker.Steps.MarkStep.Process()
Mono.Linker.Steps.MarkStep.Process(LinkContext上下文)位于
Mono.Linker.Pipeline.Process(LinkContext上下文)位于
MonoDroid.Tuner.Linker.Process(LinkerOptions选项,LinkContext&
上下文)
Xamarin.Android.Tasks.LinkAssemblies.Execute(DirectoryAssemblyResolver
res)在Xamarin.Android.Tasks.LinkAssemblies.Execute()在
Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
在
Microsoft.Build.BackEnd.TaskBuilder.d__26.MoveNext()EClinicForDoctor.Android
在Internet上搜索后,我发现此solution表示:
解决此问题的方法是确保您具有最新支持的Android SDK版本,并将“目标框架”设置为“使用最新安装的平台”。还建议您将“目标Android版本”设置为“使用目标框架版本”,并将最低Android版本设置为API 15或更高版本。这被视为受支持的配置。
因此,我更新了Android SDK,设置了目标框架并将最低Android版本设置为API 15。
但是,我仍然遇到相同的错误。另一个解决方案说我应该更新NuGet软件包。我发现软件包System.Runtime.CompilerServices.Unsafe
的版本为4.3.0,并且此软件包有更新。更新软件包时,该错误不再出现,但是出现了另一个问题。部署应用程序后,它会运行并停止,没有任何错误消息。移动设备只是退出应用程序而没有显示任何错误消息。当软件包System.Runtime.CompilerServices.Unsafe
的版本高于4.3.0时,会发生这种情况。我试图删除软件包,并且再次发生相同的问题。我怎么解决这个问题?
最佳答案
我现在已经在几个不同的位置看到了此问题的弹出窗口。这里有一些讨论,例如:https://github.com/xamarin/xamarin-android/issues/1196
这个Github问题也列出了一些(可能的)解决方案,得到最积极反馈的一个似乎是这样的:
这是一个可行的解决方法。它很笨拙,但可以使用
最小的麻烦。将其放在XML文件中,然后在您的Android中<Import>
csproj文件结尾。它至少适用于System.Buffers
<!-- Workaround for https://github.com/xamarin/xamarin-android/issues/1162 -->
<Project>
<Target Name="ReplaceRefAssemblies" AfterTargets="_ResolveAssemblies">
<ItemGroup>
<ResolvedAssembliesFixedWindows Include="@(ResolvedAssemblies->Replace('\ref\','\lib\'))" />
<ResolvedAssembliesFixedUnix Include="@(ResolvedAssemblies->Replace('/ref/','/lib/'))" />
<ResolvedAssembliesFixed Include="@(ResolvedAssembliesFixedWindows)" Condition="@(ResolvedAssembliesFixedWindows) != @(ResolvedAssemblies)" />
<ResolvedAssembliesFixed Include="@(ResolvedAssembliesFixedUnix)" Condition="@(ResolvedAssembliesFixedUnix) != @(ResolvedAssemblies)" />
<ResolvedAssemblies Remove="@(ResolvedAssemblies)" />
<ResolvedAssemblies Include="@(ResolvedAssembliesFixed)" />
</ItemGroup>
</Target>
</Project>
另一个使用上面的XML并说:
我刚刚从上面的链接复制了内容,并将其另存为
UnsafeFix.xml
文件在Android项目文件夹中。然后刚刚添加:
<Import Project="UnsafeFix.xml" />
在android .csproj文件的末尾,就在清除所有内容,重新编译,终于成功了!