窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

Visual Studio for Macで netstandard 2.0なプロジェクトでXamarin.Formsを使ってみる

追記

Visual Studio for Mac 7.3.0.708で以下の不具合が修正されています.

注意!!!!!!

以下の手段でタイトルの件は試すことが出来ますが,現在手元のVisual Studio for Mac 7.3.0.692で,jsonファイルを開くとVisual Studio for Macの動作が不安定,またファイルを閉じようとするとクラシュする問題が発生しています. 試す方は自己責任で...


Beta Release: 15.5 Preview 1 | Xamarin Releases

つい先日 Visual Studio for Mac 7.2のStableがリリースされたばかりですが,さっそく7.3のPreviewも配信され始めました.

その中でも非常に注目なのが,Xamarin.Forms 2.4を使用し,netstandardなプロジェクトで開発できるようになったことです.

Xamarin.Forms 2.4.0 Service Release 1 - Xamarin

公式でもアナウンスされていましたが,リリースされたときから

> NET Standard support does not work completely with Visual Studio for Mac. We highly recommend waiting for an update and service release. The work to improve this support is being tracked here.

と言われてビルドをすることが出来ませんでした(xamlの埋め込みの問題でしたっけ?)

ですが,今回のアプデにより以下の Xamarin.Forms 2.4対応のコミットがマージされたことにより試すことが出来そうです.

Merge pull request #3159 from mono/d15-5-support-xamarin-forms-2.4 · mono/monodevelop@0a9c6a5 · GitHub

それでは実際に試してみましょう.


あれ,実はもう7.2でもxamlファイルが見えなくなったりするバグはあれど出来そう...

https://developercommunity.visualstudio.com/content/problem/127509/xaml-forms-page-issue-in-net-standard-project-vs-7.html


やり方は概ね

www.nuits.jp

id:nuitsjp さんの記事を追っていけば問題ないのですが,ここで変更点が一部あります.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Update="**\*.xaml.cs" DependentUpon="%(Filename)" />
    <EmbeddedResource Include="**\*.xaml" SubType="Designer" Generator="MSBuild:UpdateDesignTimeXaml" />
  </ItemGroup>
  
  <ItemGroup>
    <PackageReference Include="Xamarin.Forms" Version="2.3.5.256-pre6" />
  </ItemGroup>
</Project>

こう書かれているものを,

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  
  <ItemGroup>
    <PackageReference Include="Xamarin.Forms" Version="2.4.0.282" />
  </ItemGroup>
</Project>

こう変えます,更にシンプル!!

自分で EmbeddedResource などと記述してしまうと,もともとXamarin.Forms 2.4のビルドタスクに含まれているxaml関係のタスクとかぶってしまって,

Duplicate 'Compile' items were included. The .NET SDK includes 'Compile' items from your project directory by default. You can either remove these items from your project file, or set the 'EnableDefaultCompileItems' property to 'false' if you want to explicitly include them in your project file. For more information, see https://aka.ms/sdkimplicititems.

と出て怒られてしまうからです.

その後一度このnetstandardなライブラリのみでビルドをかけて,その後iOSAndroidの実行などをするとうまく通ります. だめだったらcleanして試しましょう.

追記

以上の方法で現在開発しているプロジェクトを書き変えて実装を進めています. 残念なことにファイルダイアログなどを使用して,新しいxamlファイルを作成すると,csprojファイルに自動的に依存が追加されてしまってビルドが通らなくなります. 毎回自分でcsprojを編集して,embeddedの欄を消す必要があるようです...めんどい

またその方法で削除すると,UnloadしてReloadするまでそのxamlファイルがプロジェクトから見えなくなります...なんだこれは...

更に追記

それからこの問題に関するBugzillaを監視していたのですが,最近おもしろいハックが紹介されていたので紹介します.

59286 – Xamarin.Forms default MSBuild items not handled

Xamarin.Forms.AddinのContentViewとかのテンプレートファイルに対してSubType="Designer"を加えるだけ.

実際に試してみましたが,どうも良さそうな感じでした.

以上です.