System.Runtime.CompilerServices.Unsafe在Xamarin表单

时间:2018-04-09 11:06:02

标签: c# android xamarin.forms release

我构建了一个完整的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。

enter image description here enter image description here enter image description here

但是,我仍然得到同样的错误。另一个解决方案是我应该更新 NuGet包。我发现软件包System.Runtime.CompilerServices.Unsafe的版本是4.3.0,并且此软件包有更新。更新程序包时,错误不再出现,但会出现另一个问题。部署应用程序后,它会运行并停止,而不会显示任何错误消息。移动设备只是退出应用程序而不显示任何错误消息。当程序包System.Runtime.CompilerServices.Unsafe的版本高于4.3.0时会发生这种情况。我试图删除包,同样的问题再次发生。我该如何解决这个问题?

2 个答案:

答案 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并说:

  
      
  1. 我刚从上面的链接中复制了内容,并将其保存为Android项目文件夹中的UnsafeFix.xml文件。
  2.   
  3. 然后在android .csproj文件末尾添加:<Import Project="UnsafeFix.xml" />,就在
  4. 之前   
  5. 清除所有内容,重新编译,最终有效!
  6.   

答案 1 :(得分:1)

最后我得到了解决方案。 @Gerald Versluis提供的issue中的一条评论解决了这个问题:

  

我按照hongliyu2002的这些步骤进行操作   https://forums.realm.io/t/could-not-load-assembly-system-runtime-compilerservices-unsafe-during-startup-registration/974/4

     
      
  1. 转到C:\ Users%user%.nuget \ system.runtime.compilerservices.unsafe \ 4.4.0,并且   删除&#34; ref&#34;文件夹然后复制&#34; lib&#34;文件夹并重命名   复制回&#34;参考&#34;。
  2.   
  3. 清理所有&#34; bin&#34;和&#34; obj&#34;项目中的文件夹。
  4.   
  5. 重建并运行..
  6.         

    这个简单的解决方法,对我有用:)我当前的版本是   Xamarin.Forms 2.5.1.444934