【やりたいこと】
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"; } } } ```
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/28 01:37
2019/02/28 11:53
2019/02/28 12:21
2019/03/01 01:35
2019/03/01 02:55 編集
2019/03/01 04:04
2019/03/01 04:05
2019/03/01 05:00
2019/03/01 05:34
2019/03/01 08:16
2019/03/01 08:42 編集
2019/03/04 01:59