Xamarin.Forms+.NET Standard 1.6を試す
.NET Standardを眺めてると、PCLとは違って、APIが標準でたくさんあって素敵じゃないですか。
見てる感じだと、UdpClientとかも普通に存在するし、.NET 4.5とかのものとは違う何かだけど、System.Timerなどというものもある(詳細がよくわからん・・・)。
PCLでコード書くと、とっても息苦しい思いするじゃないですか。嫌なんですよね。実行時にNotSupportedExceptionとか投げてくれる方がコードはずっと書きやすいと思うんです。
C++ #ifdefに慣れてると、Sharedでプロジェクトつくったり、Sharedでコード書く方が気が楽ではあるんですよね・・・PCL眺めるとね。
Disclaimer
御託はさておき、Visual Studio 2017上で、Xamarin.Forms+.NET Standard 1.6を試してみたので、自分のメモぐらいの感じでここに書き残しておきます。
普通にXamarin.Forms (PCL)でプロジェクトを作成する
Visual Studio の新規プロジェクトから普通に作る。
UWPは要らないのでこの時点で削除する
必要な人は、.NET Standardのバージョンを下げる必要があると思います。基本的には、この記事は下記の記事を参考にしているので下記を見ればいいかもしれません。
Xamarin.Forms のバージョンを確認
今回は、2.3.4.247 。
PCLのプロジェクトの csproj を書き換える
書き換えるというか、まるまる、下の内容で置き換える。クソ簡単な構造になる。
- iOSとAndroidだけあればいいので、.NET Standard 1.6 (netstandard1.6)を使う。
- Xamarin.Formsのバージョンを上で確認したバージョン(2.3.4.247)にする。
Duplicate ‘System.Reflection.AssemblyCompanyAttribute’ attribute
表題のようなエラーが出るが、ググったところ次のような記事を発見。
流し読みした結果、「Properties/AssemblyInfo.csを消せ」という大胆な案が。なるほど。確かにそうすればこのエラーは消えるよね。バージョン情報が消えるけど、どうせ、単なる1依存ライブラリなのでいいでしょう。
NuGetしたライブラリが.Android/.iOSのプロジェクトから認識されません:(
書き忘れてました・・・というか、別プロジェクトで同じことをして、ビルドできなくて???ってなってここに書き忘れていたことを気づきました。
最初に紹介したページには、次のような注意書きがあります。
For now, you’ll need to add the
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
property near the top of your iOS and Androidcsproj
files. That tells NuGet restore to use thePackageReference
mode even if you don’t have any direct packages (this is important for transitive restore). If you have anyPackageReference
elements in your iOS or Androidcsproj
, then you don’t need this. For UWP, you already should have aPackageReference
to the UWP meta-package (Microsoft.NETCore.UniversalWindowsPlatform
version 5.3.2).If you hit any issues with binaries not showing up in your
bin
directories (for your Android and iOS “head” projects), make sure that you have setCopyNuGetImplementations
totrue
in yourcsproj
.
要は、.Android/.iOS側のcsproj中の最初の方(最初のPropertyGroupとか)に次の2つの要素を足せということです。
場所がわかんねーよって人は、下記のサンプルなんかを参考にすればいいかと: