nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

Xamarin.Forms 2.3.4.247で"XamlCTask task failed unexpectedly"の回避方法

Xamarin.Formsではバージョンに関係なく、次のようなケースで元々"XamlCTask task failed unexpectedly"が発生する事がありました。

  • ソリューション内のプロジェクトによってXamarin.Formsのバージョンが違う
    (よくUWPのプロジェクトだけ更新に失敗したりします)
  • Xamarin.Formsのバージョンをアップデートして、packagesフォルダに古いバージョンが残っている

これらはそれぞれ次の対策で解決する事ができまいした。

  • ソリューション内のXamarin.Formsのバージョンを統一する
  • packagesフォルダから古いXamarin.Formsのフォルダを削除する

ただ、2.3.4.247のバージョンには固有の不具合があり、これらとは別原因で"XamlCTask task failed unexpectedly"が発生する事があります。
ただし個人的な経験から再現性は100%ではなく、ただし低くもないといった感じです。

これの対策方法ですが、つぎの二つの対処方法があります。

  1. Xamarin Forms 2.3.5-pre3より新しいバージョンにアップデートする
  2. Xamarin.Forms.targetsファイルを手で修正する

つぎのXamarin.Forms 2.4から対処されるでしょうが、Previewは入れられないという人も多いでしょう。
というわけで2.の方法を記載しておきます。

まずソリューションフォルダ下のpackagesフォルダ内の次のパスを開いてください。

Xamarin.Forms.2.3.4.270\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20

開くと、つぎのようなファイルがありますが、この中のXamarin.Forms.targetsをテキストエディタで開きます。

f:id:nuitsjp:20170830091334p:plain

ファイルの末尾のほうに、つぎのような記載があります。

<Target Name="XamlC">
    <XamlCTask
        Assembly = "$(IntermediateOutputPath)$(TargetFileName)"
        ReferencePath = "@(ReferencePath)"
        Verbosity = "2"
        OptimizeIL = "true"
        DebugSymbols = "$(DebugSymbols)"
        DebugType = "$(DebugType)"/>
</Target>

ここの「DebugType = “$(DebugType)"」を削除して次のように修正します。

<Target Name="XamlC">
    <XamlCTask
        Assembly = "$(IntermediateOutputPath)$(TargetFileName)"
        ReferencePath = "@(ReferencePath)"
        Verbosity = "2"
        OptimizeIL = "true"
        DebugSymbols = "$(DebugSymbols)"/>
</Target>

これで問題なくビルドできるはずです。

元々海外のフォーラムで対策を見つけたのですが、元情報がどこだったか完全に失念したため、リンク張るのは諦めます。。。