“LinkAssemblies”任务意外失败

40

在尝试以发布模式构建 Xamarin Forms 项目时,我们遇到了以下错误:

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)
12个回答

25

这个错误又出现了。而且我的TargetAndroidVersion是21。 - Kartik
1
嗯。在文本编辑器中查看原始项目文件;您在以下元素中看到了什么:(我的值如下)<TargetFrameworkVersion>v5.0</TargetFrameworkVersion> - Andy Hopper
2
这对我没用。你必须检查两件事:1)确保SDK 21实际上已安装...所以请前往您的SDK更新程序并安装21/22(或更高版本)。2)更改目标版本没有帮助,您还必须将“使用编译”更改为版本21。如果您已经这样做了,它应该可以工作。 - Leon Cullens
为什么目标应该是21?Xamarin.Forms要求:“Android 4.0.3(API 15)或更高版本” 注意:目标设置应该设置为使用最新/自动,并且您应该始终安装最新版本的Android SDK(写作时为6.0):来源:https://developer.xamarin.com/guides/xamarin-forms/getting-started/installation/ - tedi

5

我的情况是因为将Xamarin.ios.dll添加到便携式项目引用中而出现问题。我已经删除了该引用,现在它可以正常工作。


4
我已经将Release配置中的链接器属性从仅Sdk程序集更改为Sdk和用户程序集。
请参考以下截图:options

1
感谢您的提示,对我来说,在将链接行为设置为“不链接”后问题已得到解决。 - Ultimo_m
@Ultimo_m,一般来说这不是一个好主意,可以看看Dpedrinha在https://dev59.com/Zl4c5IYBdhLWcg3wAWPv#40931238的评论。 - James Esh
是的,你说得对。我之前也考虑过这个问题,因为它让我想起了Proguard。但是现在,在看了你的评论后,我必须寻找真正的解决方案。不知何故,添加Akavache破坏了我的发布版本构建。 - Ultimo_m

3
在我的情况下,问题是在pcl项目中引用的dll Xamarin.iOS。链接不适用于此程序集。移除该引用可以解决这个问题。

1
我也遇到了同样的问题。经过一系列的试错,我找到了解决方案。
在您的清单中,将目标Android版本设置为Android 7.1(API级别25 Nougat)或更高版本。同时将编译Android版本设置为Android 7.1。
希望这可以帮助您。

0

我发现“LinkAssembliesTask failed”错误的根本原因不同于其他人。

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

=====

假设我有两个项目:

  1. NetStandardProject

    • 引用了Assembly1。

    • Assembly1中有一个CoolGuy类,其中包含CoolGuy.Flex()方法。

  2. AndroidProject,引用了NetStandardProject。

    • 引用了Assembly2。

    • Assembly2中有一个CoolGuy类,但没有CoolGuy.Flex()方法。

链接器加载了Assembly2,并寻找CoolGuy.Flex()方法,然后出现了"LinkAssembliesTask failed"的错误,说明找不到Flex()方法。这是因为它在错误的程序集中查找。

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

最后我有点幸运,发现其中一个程序集没有被使用,所以我将其移除后,构建成功了。

希望这对未来的某个人有所帮助。

=====

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

0
在将 Android 目标版本更改为 9.0 后,我最终遇到了这个错误。我注意到在 Android 项目的 packages.config 中,所有包仍然针对 monoandroid81 而不是 monoandroid90
我通过重新安装所有 NuGet 包来解决它。可以通过在 Visual Studio 的 Package Manager Console 中输入以下命令轻松完成此操作:
Update-Package -Reinstall

虽然我建议先备份。

之后,所有的软件包都针对正确的版本,并且编译错误已经消失了。


0
我通过在NuGet包管理器中将Xamarin.Android.Support.v4降级到21.0.0版本来解决了这个问题。希望能对你有所帮助。

0

将旧的Mono Android链接更改为新的Mono Android。这对我有用。我将一些dll文件(如Xamarin.Android.Platforms等)从Monoandroid 8.0更改为Monoandroid 9.0。


-1
在我的追踪中,我已经更改了链接器属性(链接器 -> 链接)为“无”。我正在使用Visual Studio 2017 RC。

4
是的,但是关闭链接器无法解决链接器问题,对APK大小会产生重大影响,而Xamarin应用程序已经太大了,因此这不是一个真正的选择。 - Dpedrinha
这解决了VS Enterprise 2017的问题,但会增加应用程序的大小。 - Nitesh
2
为什么你要发布这样的内容?这不是一个解决方案。所有的Xamarin新手都会陷入你的陷阱。不使用链接真是可惜,你甚至应该使用完全链接。 - Emil

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