"LinkAssemblies" 任务意外失败

The "LinkAssemblies" task failed unexpectedly

当我们尝试在发布模式下构建 xamarin 表单项目时,出现错误:

C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(5,5): Error MSB4018: The "LinkAssemblies" task failed unexpectedly.
Xamarin.Android.XamarinAndroidException: error XA2006: Reference to metadata item 'System.Void Android.Widget.AbsListView::SetSelectionFromTop(System.Int32,System.Int32)' (defined in 'Xamarin.Forms.Platform.Android, Version=1.3.3.0, Culture=neutral, PublicKeyToken=null') from 'Xamarin.Forms.Platform.Android, Version=1.3.3.0, Culture=neutral, PublicKeyToken=null' could not be resolved. ---> Mono.Cecil.ResolutionException: Failed to resolve System.Void Android.Widget.AbsListView::SetSelectionFromTop(System.Int32,System.Int32)
   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()
   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, LinkContext& context)
   at Xamarin.Android.Tasks.LinkAssemblies.Execute()
   --- End of inner exception stack trace ---
   at Xamarin.Android.Diagnostic.Error(Int32 code, Exception innerException, String message, Object[] args)
   at Xamarin.Android.Tasks.LinkAssemblies.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__20.MoveNext() (MSB4018) (XXX.Android)

我们如何解决这个问题?我们已经尝试再次清洁和建造。甚至关闭 xamarin studio 并重新启动它。似乎没有任何效果。

我们正在使用最新版本的 xamarin forms 和 xamarin forms labs。我们使用的最低 android API 级别是 17。我什至尝试了最低 sdk 版本 20。

更多细节:

Xamarin Studio
Version 5.7 (build 661)
Installation UUID: f97e711d-1fe0-450f-a3bb-2d9b972ab295
Runtime:
    Microsoft .NET 4.0.30319.0
    GTK+ 2.24.22 (MS-Windows theme)
    GTK# 2.12.26

Xamarin.Android
Version: 4.20.0 (Indie Edition)
Android SDK: C:\Users\Kartik\AppData\Local\Android\android-sdk
    Supported Android versions:
        2.1    (API level 7)
        2.2    (API level 8)
        2.3    (API level 10)
        3.1    (API level 12)
        4.0    (API level 14)
        4.0.3  (API level 15)
        4.1    (API level 16)
        4.3    (API level 18)
        4.4    (API level 19)
        4.4.87 (API level 20)
        5.0    (API level 21)
Java SDK: C:\Program Files (x86)\Java\jdk1.6.0_39
java version "1.6.0_39"
Java(TM) SE Runtime Environment (build 1.6.0_39-b04)
Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)

Build Information
Release ID: 507000661
Git revision: b70bab61da996da29045ea8ee8aed1a6faedbe78
Build date: 2015-01-05 11:27:37-05
Xamarin addins: 82f6c71490562d6cd125a09287f441902fdac3d7

Operating System
Windows 6.2.9200.0 (64-bit)

显然,this is a known issue:Xamarin Forms 需要 TargetAndroidVersion 为 21。(在配置 GUI 中,这被命名为 "Compile using Android version:")

我解决了在选项 > Android 生成器 > 链接器中更改 Android 链接器行为选项从 "Link sdk Assemblies Only" 到 "don't link"。

我在 NuGet 包管理器中修复了将 Xamarin.Android.Support.v4 降级到 21.0.0 版本的问题。希望对你有帮助

只是我将链接从 "NONE" 更改为 "sdk and users assembly" 并且我 运行 我的解决方案,问题已经解决。之后你可以将 "sdk and users assembly" 更改为 "NONE" 和 运行 你的项目没有任何问题。

但发布文件的大小可能会发生变化。

enter image description here

在我的例子中,问题是在 pcl 项目中引用了 dll Xamarin.iOS。链接不适用于此程序集。删除引用解决了问题。

在追逐过程中,我已将链接器 属性(链接器 --> 链接)更改为 'None'。我正在使用 visual studio 2017 RC

在我的案例中,由于将 Xamarin.ios.dll 添加到可移植项目引用而出现问题。我已删除该引用,现在可以使用了

我也遇到了同样的问题。经过一系列的试验和错误后,我找到了解决方案。

在您的清单中将目标 Android 版本设置为 Android 7.1(API 25 级牛轧糖)或更高版本。 将编译 Android 版本也设置为 Android 7.1。

希望对您有所帮助

我更改了链接器属性 > 从仅 Sdk 程序集链接到发布配置的 Sdk 和用户程序集。

将 Android 目标版本更改为 9.0 后,我最终遇到了这个错误。我注意到,在 Android 项目的 packages.config 中,所有包的目标仍然是 monoandroid81 而不是 monoandroid90.

我通过重新安装所有 NuGet 包解决了这个问题。这可以通过 Visual Studio 中的包管理器控制台很容易地完成,方法是输入:

Update-Package -Reinstall

不过,我建议先进行备份。

在那之后所有的包都以正确的版本为目标并且编译错误消失了。

"LinkAssembliesTask failed" 错误的根本原因不同。

我正在升级 NuGet 包,弄乱了引用。

=====

假设我有两个项目:

  1. NetStandardProject

    • 引用了 Assembly1。

    • Assembly1 有一个 class 的 CoolGuy,有一个 CoolGuy.Flex() 方法。

  2. AndroidProject,引用了NetStandardProject。

    • 引用了 Assembly2。

    • Assembly2 有一个 class 的 CoolGuy,但是没有 CoolGuy.Flex() 方法。

链接器正在拉入 Assembly2,寻找 CoolGuy.Flex(),然后用 "LinkAssembliesTask failed" 炸毁,声明找不到 Flex() 方法。它不能,因为它正在查找 错误的程序集

已编译 NetStandard 项目,因为它引用了 Assembly1,并不关心 AndroidProject 引用的是什么。它是独立建造的。但是当链接器加载 Assembly2 时,它使用的是 "wrong" 程序集。

最后我有点走运,意识到其中一个程序集未被使用,所以我将其删除,构建成功。

希望对在线的人有所帮助。

=====

奖金: 如果您想查看它选择搜索哪个程序集,让构建失败,然后转到 {project}\obj{profile}{android_version}\android\assets 文件夹,然后找到 dll。您可能能够验证它不存在,并为您提供一个理解失败原因的起点。

将旧单声道 android 的链接更改为新单声道 android。它对我有用。我从 Monoandroid 8.0 更改为 Monoandroid 9.0 的某些 dll,例如 Xamarin.Android.Platforms 等..