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

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

ただいまの
回答率

89.97%

Xamarin Forms ライブラリについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 751

tukusa

score 42

【やりたいこと】

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";
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

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

Cross-Platform .NET Standard Plugin Templates

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/01 17:16

    無事動かすことができました!

    Macの方では同じプロジェクトで動かないようですが。。使えないのか、構成で対処できるのか、また調べてみます。

    BAポチさせていただきます。
    ありがとうございました!

    キャンセル

  • 2019/03/01 17:38 編集

    macはマルチターゲットに対応していないのでビルドできません。
    macでは、プラットフォーム毎にプロジェクトを作り、各プロジェクトの出力アセンブリ名を同じにすることで対応できます。

    私が作ったものですが、Firestoreのライブラリがその構成になっています。
    https://github.com/f-miyu/Plugin.CloudFirestore

    キャンセル

  • 2019/03/04 10:59

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

    キャンセル

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

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる