Xamarin Android 4.6中链接器的问题

时间:2013-04-11 16:47:04

标签: android mono linker xamarin android-support-library

昨天我已经下载了新版本的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 lib
  2. 建立链接模式设置为完整
  3. 所以,我认为这是与支持库相关的链接器错误。无论使用Android.Support.V4的哪个类或命名空间,都会立即出现错误。

    试图弄清楚我已经制作了一个带有一个FragmentActivity和一个DialogFragment的示例项目。我已经在这个问题上重现了这个问题!

    我想知道这个突破性问题暂时或即时解决方案吗?这非常重要,因为这会冻结我们的开发过程。是的,我知道此问题已发布到bug-tacker 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();
        }
    
    }
    

    我想任何人都可以重现它。如果没有,请评论你做了什么。

1 个答案:

答案 0 :(得分:0)

Xamarin.Android 4.6.2存在链接器问题,解决方法是执行以下操作:

  

备份和编辑   /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets

     

删除对CopyMdbFiles的所有引用

该信息来自Jon P,Xamarin工程师

如果您不想这样做,您可以暂时降级到4.6,直到修复程序发布(应该在接下来的几天内)。我已经验证4.6没有这个问题(好吧,我的应用程序使用Release配置构建时至少使用4.6构建)。

希望有所帮助。