XamarinではBeta channelを使用していて、最新バージョンまでアップデートしています。
Xamarin.iOSを使ってアプリを書いているのですが、とある広告SDKを組み込もうと思った時にビルドエラーが発生してしまうことが分かりました。
.aファイルをインポートした際に発生するということではなく、Unified APIのiOSバインディングプロジェクト(iOS Binding Project)を作成した直後の状態で、何もしていないのにビルドエラーが発生してしまいます。
以下のようなビルドエラーが発生します。
Error: /Users/ch3cooh/hoge/example.csproj: /Users/ch3cooh/hoge/example.csproj could not import "$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.ObjCBinding.CSharp.targets" (example)
example.csprojファイルを開くと、確かにImportタグにXamarin.iOS.ObjCBinding.CSharp.targets
が指定されており、参照しようとしていることがわかりました。
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.ObjCBinding.CSharp.targets" />
当然ですが、iOSバインディングプロジェクト(Classic API)の方では、きちんとビルドが通ります。Importタグは下記のようにパスが違っていることがわかりました。
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Xamarin.ObjcBinding.CSharp.targets" />
このことからXamarin Studioで生成されたiOSバインディングプロジェクト(Unified API)のテンプレートの参照先がおかしいということはすぐに分かったのですが、どうやって解決すればよいのかで悩み込んでしまいました。
解決策
Xamarinの公式サイトを見ても何も書かれていない(と思う)ので、試行錯誤しながら解決策を見つけました。とりあえず、これでアプリからiOSのネイティブライブラリを参照できることがわかったので、この修正で問題ないか田淵さんXamarin.iOSに詳しい方に聞いてみたいですね……。
以下、ビルドエラーの解決策です。
まずは、iOSバインディングプロジェクトのxxxx.csprojをエディタで開きます。TargetFrameworkIdentifierタグ
を追加します。
<PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 〜〜〜〜省略〜〜〜〜〜 <TargetFrameworkIdentifier>Xamarin.iOS</TargetFrameworkIdentifier> </PropertyGroup>
元々存在しているImportタグ
のパスをClassic APIのと同じにします。
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Xamarin.ObjcBinding.CSharp.targets" />
関連記事
Xamarin.iOSを使ってアプリ開発する際に逆引きとしてお使いください。