1

昨日、4.6.2 の Xamarin.Android の新しいバージョンをダウンロードしました。以前のバージョン (<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. リンク モードを Full に設定してビルドする

したがって、これはサポート ライブラリに関連するリンカーのバグだと思います。Android.Support.V4 のどのクラスまたは名前空間が使用されても、バグはすぐに現れます。

明確にするために、1 つの FragmentActivity と 1 つの 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. 2 つのソース ファイルを追加\変更

アクティビティ 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();
    }

}

誰でも再現できると思います。そうでない場合は、あなたがしたことについてコメントしてください。

4

1 に答える 1

0

Xamarin.Android 4.6.2 にはリンカーの問題があります。回避策は次のとおりです。

バックアップと編集 /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets

CopyMdbFiles へのすべての参照を削除します

その情報は、Xamarin エンジニアの Jon P によるものです。

そのハッキングをしたくない場合は、修正がリリースされるまで (数日以内にリリースされるはずです)、とりあえず 4.6 にダウングレードできます。4.6 にはこの問題がないことを確認しました (まあ、少なくとも 4.6 でビルドする場合、私のアプリは Release 構成でビルドされます)。

それが役立つことを願っています。

于 2013-04-13T05:11:21.490 に答える