次の方法で共有


第 9 章の概要: プラットフォーム固有の API 呼び出し

Note

この本は 2016 年春に発行されて以降、改訂されていません。 多くの情報はまだ価値がありますが、一部の資料は古くなっており、トピックの中にはまったく正しくないものまたは不完全なものもあります。

プラットフォームによって異なるコードを実行することが必要になる場合があります。 この章では、その手法について説明します。

共有アセット プロジェクトでの前処理

Xamarin.Forms の共有アセット プロジェクトでは、C# のプリプロセッサ ディレクティブ #if#elifendif を使用して、プラットフォームごとに異なるコードを実行できます。 これについては、PlatInfoSap1 で示されています

可変の書式が設定された段落のトリプル スクリーンショット

ただし、結果として得られるコードは、乱雑で読みにくくなる可能性があります。

共有アセット プロジェクトでの並列クラス

SAP でプラットフォーム固有のコードを実行するためのより構造化されたアプローチについては、PlatInfoSap2 サンプルで示されています。 各プラットフォーム プロジェクトには、名前は同じですが、実装はそのプラットフォームに固有である、クラスとメソッドが含まれています。 SAP では、単純にクラスがインスタンス化されて、メソッドが呼び出されます。

DependencyService とポータブル クラス ライブラリ

Note

ポータブル クラス ライブラリは、.NET Standard ライブラリに置き換えられています。 本のすべてのサンプル コードは、.NET Standard ライブラリを使用するように変換されています。

通常、ライブラリでアプリケーション プロジェクト内のクラスにアクセスすることはできません。 この制限により、PlatInfoSap2 で示されている手法はライブラリでは使用できないように見えます。 しかし、Xamarin.Forms に含まれる DependencyService という名前のクラスは、.NET リフレクションを使用して、ライブラリからアプリケーション プロジェクトのパブリック クラスにアクセスします。

ライブラリでは、各プラットフォームで使用する必要があるメンバーを含む interface を定義する必要があります。 その場合、各プラットフォームには、そのインターフェイスの実装が含まれます。 インターフェイスを実装するクラスは、アセンブリ レベルで DependencyAttribute により示される必要があります。

その後、ライブラリでは、DependencyService のジェネリック Get メソッドを使用して、インターフェイスを実装するプラットフォーム クラスのインスタンスを取得します。

これは、DisplayPlatformInfo サンプルで示されています。

プラットフォーム固有のサウンド生成

MonkeyTapWithSound サンプルでは、各プラットフォームのサウンド生成機能にアクセスすることによって、MonkeyTap プログラムにビープ音を追加しています。