Xamarin.Forms在发布模式编译时出现Mono.Linker.MarkException: Error processing method错误

17
我有一个使用Xamarin.Forms(2.5.1.527436)和VS2017(15.7.1)开发的应用程序,运行在Windows上。该android项目在debug模式下可以正常构建和运行。但是,在release模式下构建时,会出现以下错误:
“LinkAssemblies”任务意外失败。 Mono.Linker.MarkException:处理程序期间出错:'System.Void Xamarin.Forms.Pages.BaseDataSource/d__22::MoveNext()',在程序集中:'Xamarin.Forms.Pages.dll' ---> Mono.Cecil.ResolutionException: 未能解析 System.Void Xamarin.Forms.Log::Warning(System.String,System.String) at Mono.Linker.Steps.MarkStep.HandleUnresolvedMethod(MethodReference reference) at Mono.Linker.Steps.MarkStep.MarkMethod(MethodReference reference) at Mono.Linker.Steps.MarkStep.MarkInstruction(Instruction instruction) 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 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.Execute() at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() at Microsoft.Build.BackEnd.TaskBuilder.d__26.MoveNext()
我选择“仅SDK程序集”,最低安卓版本为5.1(级别22),目标Android版本为8.1(级别27)。
你有任何想法吗?

1
请参考此链接 - Robbit
感谢 @JoeLv-MSFT 的链接,它让我朝着正确的方向前进了。我发现我的问题是一个不必要的 NuGet 包,这个包显然加载了相同的程序集。再次感谢! - Mark Erickson
6个回答

14

经过一番研究,我采取了以下措施解决问题:

  • 升级了一些NuGet包,在3个项目(Forms、Android和iOS)中进行操作,这样可以修复发布模式下的问题。

或者

  • 链接设置为“无”也可以解决问题,但我认为不建议这样做。

我遇到了同样的问题。"Linking to None" 是什么意思? - fsulser

2
所以,将链接更改为none并确保所有Nuget包都已更新对我没有起作用。在我的情况下,我的Android项目已经被调整和更改了近一年时间,添加和删除Nuget包。因此,我的解决方案中有大量的Android特定Nuget包是不需要的。为了确定我可以删除什么,
  1. 我创建了一个专门用于Android的全新Xamarin表单项目。
  2. 我添加了所有原始解决方案中不是Android特定的Nuget包。
  3. 我确保新解决方案在调试和发布模式下编译。
  4. 我回到了我的原始解决方案,并删除了所有存在于该实际解决方案中但不在我的全新解决方案中的Nuget包。

我唯一需要更改的代码是关于我的启动画面。在我的启动画面活动中,我有以下内容

using Android.Support.V7.App;
public class SplashActivity : AppCompatActivity

当我移除对Android.Support.V7.App库的引用时,无法找到AppCompatActivity。要解决这个问题,我只需添加以下using语句:

using AndroidX.AppCompat.App;

当我完成所有这些步骤后,应用程序将以发布模式编译(仍然将链接设置为none),并且可以正常运行。

如果其他解决方案最终无法解决您的问题,这只是另一种选择。


1
我通过更新Xamarin.Forms到最新稳定版本(v5.0.0.2196)解决了这个问题。 据我观察,当我更新Xamarin.Forms时,它也会安装正确版本的依赖项。这包括解决我的问题的正确版本的Xamarin.AndroidX.RecyclerView。

0
在我的情况下,这个错误是因为 Android 项目安装了不同版本的 Xamarin.Forms NuGet 包。当我在所有 Xamarin 项目中安装了相同的版本时,问题得到了解决。

0
我通过将Xamarin.Forms版本更新到最新的稳定版本5.0.0.2337来解决了这个问题。

0
我成功地解决了这个问题,方法是先在共享项目以及 Android 和 iOS 两个项目中移除 plugin.InAppBilling 的 nuget 包。然后删除所有项目的 bin 和 obj 文件夹。最后重新构建即可!不用担心插件,因为你可以在发布后再添加它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接