Проблемы с компоновщиком в Xamarin Android 4.6

Вчера я скачал новую версию Xamarin.Android 4.6.2. Когда я попытался собрать свой проект, который корректно работал в предыдущих версиях (‹4.6), теперь я получаю следующую ошибку:

(извините, что на русском)

Ошибка  1   непредвиденная ошибка при выполнении задачи "LinkAssemblies".
System.ArgumentOutOfRangeException: Заданный аргумент находится вне диапазона допустимых значений.
в Mono.Collections.Generic.Collection`1.get_Item(Int32 index)
в Mono.Cecil.Mdb.MdbReader.ReadLocalVariables(MethodEntry entry, MethodBody body, Scope[] scopes)
в Mono.Cecil.Mdb.MdbReader.Read(MethodBody body, InstructionMapper mapper)
в Mono.Cecil.Cil.CodeReader.ReadMethodBody()
в Mono.Cecil.Cil.CodeReader.ReadMethodBody(MethodDefinition method)
в Mono.Cecil.MethodDefinition.<get_Body>b__2(MethodDefinition method, MetadataReader reader)
в Mono.Cecil.ModuleDefinition.Read[TItem,TRet](TItem item, Func`3 read)
в Mono.Cecil.MethodDefinition.get_Body()
в Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition method)
в Mono.Linker.Steps.MarkStep.ProcessQueue()
в Mono.Linker.Steps.MarkStep.Process()
в Mono.Linker.Steps.MarkStep.Process(LinkContext context)
в Mono.Linker.Pipeline.Process(LinkContext context)
в MonoDroid.Tuner.Linker.Process(LinkerOptions options, LinkContext& context)
в Xamarin.Android.Tasks.LinkAssemblies.Execute()
в Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
в Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__20.MoveNext() AndroidApplication7

Текст на русском языке означает:

Error 1 Unexpected error while trying to execute task "LinkAssemblies".
System.ArgumentOutOfRangeException: Provided argument is out off range

Я потратил много времени, пытаясь понять эту ошибку, и обнаружил, что ошибка появляется, когда (оба):

  1. используя библиотеку Android.Support.V4
  2. здание с установленным режимом связывания «Полный»

Итак, я думаю, что это ошибка компоновщика, связанная с библиотекой поддержки. Независимо от того, какой класс или пространство имен Android.Support.V4 используется, ошибка появляется мгновенно.

Пытаясь внести ясность, я сделал пример проекта с одним FragmentActivity и одним DialogFragment и ничего больше. И я воспроизвел эту проблему на нем!

Я хочу знать, есть ли временное или мгновенное решение этой проблемы? Это очень важно, потому что это замораживает наш процесс разработки. Да, я знаю, что эта проблема была опубликована на сайте для устранения ошибок https://bugzilla.xamarin.com/show_bug.cgi?id=7946

Вот как я сделал свой пример проекта. 1. Нажал «Новый проект» в Visual Studio 2012 и выбрал «Приложение Android». 2. Изменил «Минимальный Android для цели» на 1.6. 3. Задал «Свойства конфигурации» «Связывание» с «Sdk и пользовательские сборки». 4. Добавлена ​​ссылка на Android.Mono.Support.V4 5. Добавлено\Изменено два исходных файла

Деятельность 1:

public class Activity1 : FragmentActivity
{
    int count = 1;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button>(Resource.Id.MyButton);

        button.Click += delegate { button.Text = string.Format("{0} clicks!", count++);
                                     DialogFragment messageFragment = MyDialogFragment.GetInstance();
                                     messageFragment.Show(SupportFragmentManager, "MessageDialog");
        };
    }
}

MyDialogFragment:

 public class MyDialogFragment : DialogFragment
 {
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    }

    public static MyDialogFragment GetInstance()
    {
        return new MyDialogFragment();
    }

    public override Dialog OnCreateDialog(Bundle savedInstanceState)
    {
        var builder = new AlertDialog.Builder(Activity);
        builder.SetMessage("Message");
        builder.SetPositiveButton("Ok", (sender, args) => { });

        return builder.Create();
    }

}

Думаю, воспроизвести сможет любой. Если нет, пожалуйста, прокомментируйте, что вы сделали.


person user2271196    schedule 11.04.2013    source источник
comment
Возможно, связано с этой проблемой в Mono 3.0.8 и 3.0.9. форумы. xamarin.com/discussion/3100/   -  person Danyal Aytekin    schedule 12.04.2013
comment
4.6.2 не представляет моно 3.x, это ошибка версии 4.6.2.   -  person Brett Duncavage    schedule 13.04.2013


Ответы (1)


Существует проблема с компоновщиком в Xamarin.Android 4.6.2. Обходной путь заключается в следующем:

резервное копирование и редактирование /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets

удалить все ссылки на CopyMdbFiles

Эта информация предоставлена ​​Джоном П., инженером Xamarin.

Если вы не хотите заниматься этим хакерством, вы можете просто перейти на 4.6, пока не будет выпущено исправление (должно быть в ближайшие пару дней). Я убедился, что 4.6 не имеет этой проблемы (ну, мое приложение строится с конфигурацией Release, по крайней мере, при сборке с 4.6).

Надеюсь, это поможет.

person Brett Duncavage    schedule 13.04.2013