Xamarin.iOSでCS1703:Multiple assemblies with equivalent identity have been imported

Xamarin.FormsでMessagePackを使ってみようと思い、nugetでサクッとパッケージを入れたら、iOSプロジェクトのビルドでエラーが出ます。

CS1703:ID が同一の複数のアセンブリ ('C:\Users\spacekey\.nuget\packages\system.reflection.emit\4.3.0\ref\netstandard1.1\System.Reflection.Emit.dll' と 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\Xamarin.iOS\v1.0\Facades\System.Reflection.Emit.dll') がインポートされました。重複している参照の一方を削除します。

これを解決しようとして、調べると解決策が見つかりますが、変なところにはまり込みました。

状況

  • Visual Studio 2017 15.9.4
  • Xamarin.iOS 12.2.1.12
  • Xamarin.Forms 3.4.0.1008975
  • Prism.Unity.Forms 7.1.0.431
  • MessageePack 1.7.3.4

ベースになってるプロジェクトはPrism Blank Appで、Xamarin.FormsやPrism.Unityはnugetでアップデートしています。その後、nugetでMessagePackをインストールします。

で、特になにも実装せず、iOSプロジェクトの方をビルドするとエラーが出ます。

CS1703の解決法

ググると解決法が見つかります。

How to resolve compilation issue CS1703 error in a Xamarin.iOS project

iOSプロジェクトのPackageReferenceがあるItemGroupに、下記を追記します。

<PackageReference Include="System.Reflection.Emit">
  <Version>4.3.0</Version>
  <ExcludeAssets>all</ExcludeAssets>
</PackageReference>

Visual Studioで、いったんiOSプロジェクトを右クリックからアンロードして、さらに右クリックで編集で、上記を追記します。

  <ItemGroup>
    <PackageReference Include="Xamarin.Forms" Version="3.4.0.1008975" />
    <PackageReference Include="Prism.Unity.Forms" Version="7.1.0.431" />
    <PackageReference Include="System.Reflection.Emit">
      <Version>4.3.0</Version>
      <ExcludeAssets>all</ExcludeAssets>
    </PackageReference>
  </ItemGroup>

今回の場合、こんな感じになります。
で、保存してプロジェクトの再読み込みで完了です。

はまりどころ

さて、これでビルドをするとエラーが出ます。

Could not find any available provisioning profiles for iOS.

CS1703のエラーは出ないんですが、代わりに変なエラーが出ます。
特にcsprojの編集にミスってるわけでもないし、ライブラリを入れる前はちゃんとビルドもできるし、Simulatorでも動くことは確認してありますので、プロファイルの問題ではありません。

さっき追加した記述を削除したら、元通りCS1703がでます。

解決法

さて、これどうやって解決するかというと……

「Visual Studioを再起動してソリューションを読み込み直す」

です。

ライブラリを触るような操作をしたあとは安全のため再起動、っていうやつですかね。

ちなみに、これはMessagePackだからというわけではなく、依存しているライブラリでバージョン不一致があると出るエラーなので、調べている過程でSystem.Reflection.Emit.dll以外でも困っている人がいるようでした。

やっと本題に入れます。