我构建了一个完整的Xamarin From应用程序。当我将构建模式更改为Release
时,我收到以下错误消息:
严重级代码描述项目文件行抑制状态 错误“LinkAssemblies”任务意外失败。 Mono.Linker.MarkException:错误处理方法:'System.Void Microsoft.Extensions.Primitives.InplaceStringBuilder ::追加(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 参考)at Mono.Linker.Steps.MarkStep.MarkInstruction(指令说明)
在Mono.Linker.Steps.MarkStep.MarkMethodBody(MethodBody body)at Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition方法)
在Mono.Linker.Steps.MarkStep.ProcessQueue()---内部结束 异常堆栈跟踪--- at Mono.Linker.Steps.MarkStep.ProcessQueue()at Mono.Linker.Steps.MarkStep.ProcessEntireQueue()at Mono.Linker.Steps.MarkStep.Process()at Mono.Linker.Steps.MarkStep.Process(LinkContext context)at Mono.Linker.Pipeline.Process(LinkContext context)at MonoDroid.Tuner.Linker.Process(LinkerOptions选项,LinkContext& 上下文) Xamarin.Android.Tasks.LinkAssemblies.Execute(DirectoryAssemblyResolver res)在Xamarin.Android.Tasks.LinkAssemblies.Execute()at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() 在 Microsoft.Build.BackEnd.TaskBuilder.d__26.MoveNext()EClinicForDoctor.Android
在互联网上搜索后,我发现solution表示:
此问题的解决方法是确保您拥有最新支持的Android SDK版本,并将Target Framework设置为使用最新安装的平台。还建议您将目标Android版本设置为使用目标框架版本,将最低Android版本设置为API 15或更高版本。这被视为支持的配置。
因此,我更新了Android SDK,设置了Target Framework并将最低Android版本设置为API 15。
但是,我仍然得到同样的错误。另一个解决方案是我应该更新 NuGet包。我发现软件包System.Runtime.CompilerServices.Unsafe
的版本是4.3.0,并且此软件包有更新。更新程序包时,错误不再出现,但会出现另一个问题。部署应用程序后,它会运行并停止,而不会显示任何错误消息。移动设备只是退出应用程序而不显示任何错误消息。当程序包System.Runtime.CompilerServices.Unsafe
的版本高于4.3.0时会发生这种情况。我试图删除包,同样的问题再次发生。我该如何解决这个问题?
答案 0 :(得分:3)
我现在在几个不同的地方看到了这个问题的弹出窗口。这里有一些讨论,如: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并说:
- 我刚从上面的链接中复制了内容,并将其保存为Android项目文件夹中的
UnsafeFix.xml
文件。- 然后在android .csproj文件末尾添加:
之前<Import Project="UnsafeFix.xml" />
,就在- 清除所有内容,重新编译,最终有效!
醇>
答案 1 :(得分:1)
最后我得到了解决方案。 @Gerald Versluis提供的issue中的一条评论解决了这个问题:
我按照hongliyu2002的这些步骤进行操作 https://forums.realm.io/t/could-not-load-assembly-system-runtime-compilerservices-unsafe-during-startup-registration/974/4
- 转到C:\ Users%user%.nuget \ system.runtime.compilerservices.unsafe \ 4.4.0,并且 删除&#34; ref&#34;文件夹然后复制&#34; lib&#34;文件夹并重命名 复制回&#34;参考&#34;。
- 清理所有&#34; bin&#34;和&#34; obj&#34;项目中的文件夹。
- 重建并运行..
醇>这个简单的解决方法,对我有用:)我当前的版本是 Xamarin.Forms 2.5.1.444934