質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
.NET Standard

.NET Standardは、さまざまな.NET環境で用いることができる基本的なAPIセットまたはそれを定めた仕様です。この標準に沿って.NET実装を行うことで、どのプラットフォームでも動くポータブルなライブラリを作成できます。

Mono

Monoは、Ecma標準に準じた.NET Framework互換の環境を実現するためのオープンソースのソフトウェア群です。Linux、Mac OS X、Windowsなど多くのプラットフォームで動作します。その他にも、特定プラットフォーム向けに特化したサブプロジェクトも存在します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

3209閲覧

Xamarin Forms ライブラリについて

tukusa

総合スコア44

.NET Standard

.NET Standardは、さまざまな.NET環境で用いることができる基本的なAPIセットまたはそれを定めた仕様です。この標準に沿って.NET実装を行うことで、どのプラットフォームでも動くポータブルなライブラリを作成できます。

Mono

Monoは、Ecma標準に準じた.NET Framework互換の環境を実現するためのオープンソースのソフトウェア群です。Linux、Mac OS X、Windowsなど多くのプラットフォームで動作します。その他にも、特定プラットフォーム向けに特化したサブプロジェクトも存在します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2019/02/27 10:39

編集2019/03/01 01:30

【やりたいこと】

Xamarin Formsのライブラリ作成
ライブラリ内でiOS、Android、のネイティブな機能を利用する

【理解していること】
・Forms、iOS、Androidでの実装、DependencyServiceなど
・Nugetパッケージの使い方
・プロジェクトの参照の追加

【調べたこと】
・Formsのライブラリは、.NET Standard libraryを使おうとなっていること
・ライブラリの作り方

【試したこと】
・.NET Standard libraryプロジェクトを作って、参照させ、機能の利用は出来ました。

【詰まっていること】
・.NET Standard libraryプロジェクトにはmonoAndroidと互換性がない?ので、Androidの機能が利用できない。
(xamarin android support library v7 も入れられず)

・Xamnarin.Androidのライブラリを別途作成し、.NET Standard libraryプロジェクトから参照することは出来たが、こちらも互換性がないとビルド出来ず。

(iOSはまだ全く手付かず)


環境
win10 VS2017
Mac VS for Mac

FormsからDependencyServiceを使い、Android側でXamnarin.Androidライブラリを使うのであれば動くとは思うのですが、.NET Standard libraryから利用する、または、.NET Standard library内で完結するような作りというのは無理でしょうか。 --- ## 追記 20190301 * Xamarin.Fomrsプロジェクトを作成 * Cross-Platform .NET Standard Plugin Templates を追加 * Xamarin.Formsプロジェクトからライブラリプロジェクトを参照 * Xamarin.Androidプロジェクトからライブラリプロジェクトを参照 * Xamarin.iOSプロジェクトはアンロード * CrossTestPlugin.shared.csにてTestPluginImplementationをインスタンス化しようとした時にNotImplementedExceptionが吐かれる ``` CrossTestPlugin.shared.cs using System; using Plugin.TestPlugin; namespace Plugin.TestPlugin { /// <summary> /// Cross TestPlugin /// </summary> public static class CrossTestPlugin { static Lazy<ITestPlugin> implementation = new Lazy<ITestPlugin>(() => CreateTestPlugin(), System.Threading.LazyThreadSafetyMode.PublicationOnly); /// <summary> /// Gets if the plugin is supported on the current platform. /// </summary> public static bool IsSupported => implementation.Value == null ? false : true; /// <summary> /// Current plugin implementation to use /// </summary> public static ITestPlugin Current { get { ITestPlugin ret = implementation.Value; if (ret == null) { throw NotImplementedInReferenceAssembly(); } return ret; } } static ITestPlugin CreateTestPlugin() { #if NETSTANDARD1_0 || NETSTANDARD2_0 return null; #else #pragma warning disable IDE0022 // Use expression body for methods return new TestPluginImplementation(); // ここでNotImplementedException が出る  #pragma warning restore IDE0022 // Use expression body for methods #endif } internal static Exception NotImplementedInReferenceAssembly() => new NotImplementedException("This functionality is not implemented in the portable version of this assembly. You should reference the NuGet package from your main application project in order to reference the platform-specific implementation."); } } ``` ``` ITestPlugin.shared.cs using System; using System.Collections.Generic; using System.Text; namespace Plugin.TestPlugin { public interface ITestPlugin { string GetVersionName(); } } ``` ``` TestPlugin.android.cs using Android.Content; using System; using System.Collections.Generic; using System.Text; namespace Plugin.TestPlugin { /// <summary> /// Interface for TestPlugin /// </summary> public class TestPluginImplementation : ITestPlugin { public string GetVersionName() { Context context = Android.App.Application.Context; //Android.App.Application.Context; var name = context.PackageManager.GetPackageInfo(context.PackageName, 0).VersionName; return name; } } } ``` ``` TestPlugin.apple.cs using System; using System.Collections.Generic; using System.Text; namespace Plugin.TestPlugin { /// <summary> /// Interface for TestPlugin /// </summary> public class TestPluginImplementation : ITestPlugin { public string GetVersionName() { return "ios"; } } } ```

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ネイティブの機能の呼び出しは、Plugin for Xamarinで作成するのがいいです。
Windowsならテンプレートの拡張機能があります。

Cross-Platform .NET Standard Plugin Templates

このテンプレートを利用すれば、.NET Standardから各プラットフォームの機能を呼び出せるNuGetパッケージが作成できます。

Xamarin.Essentialsが似たような感じなので、作り方の参考になるかと思います。

投稿2019/02/27 12:35

編集2019/02/28 01:23
f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tukusa

2019/02/28 01:37

ありがとうございます! なんと便利そうなテンプレート 早速DLして試してみます!
tukusa

2019/02/28 11:53

朝からずっとチャレンジしているのですが、まだビルドすることができません。。。 > .sharedのinterfaceを.android、.apple に実装して、.sharedのクラスでインスタンス化しようとしているのですが、.android、.appleが参照されておらず、usingが足らないとか言われてしまう。 すみませんBAはお待ちください。。
f-miyu

2019/02/28 12:21

試しているソースコードをあげてもらってもいいですか?
tukusa

2019/03/01 01:35

ありがとうございます 20190301 を追加しました。
f-miyu

2019/03/01 02:55 編集

確かにAndroidのプロジェクトでライブラリプロジェクトが参照されているでしょうか? 参照されているのであれば、動くはずです。 それなのに動かないのであれば、一度クリーンしたり、bin、objフォルダの削除も試してみてください。
tukusa

2019/03/01 04:04

改めて参照確認、 bin、obj削除やプロジェクトのアンロード、VS再起動、プロジェクト復元、パッケージの復元など、それらしきものも一通り行なっているのですが、ダメで、、 再度見直ししてみます
f-miyu

2019/03/01 04:05

githubなどでプロジェクトごと見せてもらっても良いですか?
f-miyu

2019/03/01 05:34

TestPlugin.csprojの6行目のTargetFrameworksからuap10.0.16299を取り除けば動きました。 修正前 <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">netstandard1.0;netstandard2.0;Xamarin.iOS10;MonoAndroid81;uap10.0.16299</TargetFrameworks> 修正後 <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">netstandard1.0;netstandard2.0;Xamarin.iOS10;MonoAndroid81</TargetFrameworks>
tukusa

2019/03/01 08:16

無事動かすことができました! Macの方では同じプロジェクトで動かないようですが。。使えないのか、構成で対処できるのか、また調べてみます。 BAポチさせていただきます。 ありがとうございました!
f-miyu

2019/03/01 08:42 編集

macはマルチターゲットに対応していないのでビルドできません。 macでは、プラットフォーム毎にプロジェクトを作り、各プロジェクトの出力アセンブリ名を同じにすることで対応できます。 私が作ったものですが、Firestoreのライブラリがその構成になっています。 https://github.com/f-miyu/Plugin.CloudFirestore
tukusa

2019/03/04 01:59

ありがとうございます!! 見させていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問