読者です 読者をやめる 読者になる 読者になる

眠いしお腹すいたし(´・ω・`)

C#関連を主に書きます。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Xamarin.FormsのPCLプロジェクトを.NET Standardライブラリプロジェクトにしてみた(*'▽')

C# Xamarin Xamarin.Forms

はじめに

本記事は

qiita.com

の4日目の記事になります。

あいさつ

今年は既にXamarin最前線から退いてしまっているのでAdventCalendarへの参加は見送ろうと思っていたのですがXamarin Adventalendarの枠が4枚目のカレンダーに余っていたのでコッソリと投稿することにしてみました。

初心者枠という事でお手柔らかにお願いします。

今年は公私共に色々なことに関してある程度目標を達成することができて良かったです。

来年は今年以上に忙しくなるかもしれないので頑張っていかねばと思います。

なお去年に引き続き今年も一人ぼっちのクリスマスです('◇')ゞ

.NET Standardねぇ

未だにいまいち浸透していないように思える.NET Standard・・・

docs.microsoft.com

同時期に.NET Coreというワードが登場し、浸透する前に.NET Standardというワードが出てしまった為に余計にごちゃごちゃしてしまったなぁという印象です(´・ω・`)

各用語に関して

私の中ではこんな感じで考えてます。

PCL・・・クロスプラットフォームなライブラリを実現するために使いたいプラットフォームの公約数APIのみを使用できるライブラリ作成環境。使用できる.NET FrameworkAPIは使いたいプラットフォームによって増減する。

.NET Core・・・.NET FrameworkのサブセットでWindows Linux Mac等のクロスプラットフォーム環境で使えるフレームワーク。Monoベースでない点が重要でMonoは.NET Framework互換であったのに対して.NET Coreは.NET Frameworkのサブセット。.NET Coreをベースに作られたフレームワークASP.NET Coreがある。あと.NET Coreベースのコンソールアプリも作れる。.NET CoreにプラットフォームAPIを足してできているのがUWPかな?

.NET Standard・・・プラットフォーム関係なくAPIセットという形で.NET Foundationが定義したクラスライブラリ環境。概念としてはプラットフォームには非依存。現在1.0~1.6まであるがバージョンが上がるごとに使えるAPIが増えていく。1.3までは下位互換のバージョンであって.NET Standardの本質は1.4以降と思う。1.4以降のバージョンは.NET Framework/.NET Core/Xamarin/UWPの進化に対してAPIを調整したバージョンと考える。要するにこれまでと同じ環境で作る分にはPCLから変更する必要がないけれど、今後.NET基盤の進化に対応していく為には,NET Standardに乗り換えておかないと不便になる。ということだと思う。たぶん(;'∀') 1.4以降であっても最小APIセットは.NET Coreとなるので.NET Core以上に使えるAPIが増えることはない。

nugetの方ではPCL用が用意されいた主要なライブラリは概ね.NET Standardに対応してきたのかなというイメージです。

Xamarin.Formsと.NET Standard

Xamarin.Formsの共有プロジェクトに関してはAndroid/iOSのみであればSharedも考えられるがUWP/Tizenまで入れるとPCLにすることが現状の定石じゃないでしょうか?

PCLを.NET Standardプロジェクトに変更することは現時点でメリットは特にありません。

メリットがあるとすれば共有プロジェクトのcsprojの中身がきれいになってnugetでのライブラリ設定がproject.json記述になることで操作しやすくなる??

ですがこの先.NET StadardのAPIセットが進んでいく中ではメリットが生まれる事もあるかと思います。

直近ではvNextでしょうか。

今回はXamarin.FormsプロジェクトのPCLを.NET Standardに変更する手順を記したいと思います。

手順

今回の環境はVisual Studio 2015 Update3にて行っています。

プロジェクトを作る

まずはXamarin.FormsのPCLプロジェクトを作成します。

f:id:tamafuyou:20161203073306p:plain

こんな感じのソリューションが出来上がるかと思います。

f:id:tamafuyou:20161203073430p:plain

PCLプロジェクトからXamarin.Formsパッケージを一度外す

PCLプロジェクトのnugetマネージャーを開いてXamarin.Formsパッケージをアンインストールしてしまいます。

Xamarin.Formsのバージョンは覚えておいてください。

f:id:tamafuyou:20161203073611p:plain

PCL -> .NET Standard

PCLプロジェクトのプロパティを開いてTarget .NET Platform Standardを選択します。

f:id:tamafuyou:20161203074645p:plain

ダイアログが出てくるので「はい」を選択してください。

こんな感じに画面が変わるかと思います。

f:id:tamafuyou:20161203074858p:plain

Xamarin.Formsを追加する。

プロジェクトにproject.jsonが追加されていますので開きます。

f:id:tamafuyou:20161203075103p:plain

project.jsonをこう書き換えてください。

{
  "supports": {},
  "dependencies": {
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.0",
    "Xamarin.Forms" :  "2.3.3.168" 
  },
  "frameworks": {
    "netstandard1.1": {
      "imports": "portable-net45+win8+wpa81+wp8"
    }
  }
}

Xamarin.Formsのバージョンはアンインストールしたバージョンと同じものにしてください。

これで.NET Standardへの移行が終わりましたので実行できる状態になっていると思います。

この例ではプロジェクトにWindows8.1やWindowsPhoneプロジェクトが入っているので.NET Standard1.1になっています。

これらが必要なくAndroid/iOS/UWPであれば1.4 Android/iOSであれば1.5にあげることができます。Tizenはよくわかりませんが,NET CoreベースということなのでAndroid/iOS/Tizenであれば1.5が可能かと思います。

1.6も本来は可能なはずなのですが、どうもバグっぽい挙動でうまくビルドができません。

github.com

まだVS2017 RCでは.NET Standard 2.0はまだ使えないのですかねぇ。

いまいちVS2017への関心が高くなくて現状調べていません(´・ω・`)

以上、ありがとうございました。