2016-03-23 16 views
0

私はXamarinとC#/ .NETの世界全体でかなり新しくなっています。 Xamarinを使ってクロスプレートフォームアプリケーションを開発する予定です。他の開発者と共有するためにライブラリを作成する必要があります。私はPCLについて聞いたことがありますが、いくつかの制限があります。たとえば、iOSやAndroidプロジェクトで直接使用することはできますが、System.Netは使用できません。XamarinプロジェクトのためのC#ライブラリのコンパイル

私は、System.NetがiOSプロジェクトでAndroidプロジェクトとは異なる方法でコンパイルされていることを知っています。これがPCLで使用できない理由の1つです。しかし、ライブラリーを作成し、それを各プレートフォームごとにコンパイルすることは可能ですか?

共有プロジェクトは、私にそれをさせてください。しかし、私はそれを図書館として共有することはできません。

私がしようとしているのは、維持するコードを1つだけにすることです。一度だけ書き込み、コンパイルを2回、どこでも実行できます(Windows Phoneを除くモバイル上)。

質問:

このようなことは可能でしょうか?

+0

私は負帰還で大丈夫です。しかし、あなたは私の質問に何が問題であると言うことができますか?スジは通ってるようだ。 – Boris88

+1

答えが個人的な意見に依存していると他の人が考えている可能性は非常に高いです。 –

+1

ベイトとスイッチのトリックについては、http://log.paulbetts.org/the-bait-and-switch-pcl-trick/をお読みください。それ以外の場合は、IoC/Dependency Injectionを使用することは、プラットフォームごとに実装するための理想的なアプローチになります。それは非常に有力なテーマですが、その周りには多くのテクニックがあります。マニュアルファイルのリンクを強く勧めます。 –

答えて

0

あなたがすべきことは、iOSとAndroidの両方のクラスライブラリを作成することです。次に、それらのうちの1つのみにコードを書き込み、コードファイルを他のクラスライブラリにリンクします。そうすれば、コードを一度作成し、各クラスライブラリをコンパイルし、同じコードから2つのDLLライブラリを取得します。私たちは次のアプローチを使用し、当社のデスクトップ/アンドロイド/ IPhoneプロジェクトで

+1

これはおそらく最も恐ろしいアプローチです。あるプロジェクトを新しいファイルで更新したら、もう一方のプロジェクトを更新することを忘れないでください。あなたが避けることができれば良い選択肢はありません。 –

+0

これらのプロジェクトをすべて頻繁に更新する必要はないので、2度書き込むよりも優れた解決策です – Boris88

0

.NET Coreおよび.NET Platform Standardが公開されており、それらをチェックアウトする必要があります。彼らはPCLを置き換える未来です。

私はすでに.NETのコアRC1に部分的に#SNMPライブラリを移植し、あなたが何ができるかRC2以降に来る、

https://blog.lextudio.com/2016/03/how-to-port-snmp-library-to-net-core/

1

がどのプラットフォームにあなたを区別するために使用するコンパイラディレクティブのときの希望休みを移行しています残念ながら、これは、異なるプラットフォームで同じコードを実行する異なるライブラリを必要とするため、異なるプラットフォームに対して異なるコードを2回書くという事実を減らすものではありません。 このディレクティブを使用すると、指定したプラットフォーム用にそれぞれのライブラリまたは独自のライブラリをコンパイルできます。

2

たちは次のプロジェクト

  • ドロイド
  • タッチ
  • Common.PCL
  • Common.Shared
  • を持っていると仮定します

Droid and Touch pro PCLと共有ライブラリを参照します。 次に、Commonにインターフェイスを作成します。PCL

namespace Common.PCL 
{ 
    public interface INetSpecificFactory 
    { 
     INetSpecific CreateSomething(); 
    } 
} 

と共有

でそれを実装
using Common.PCL; 

namespace Common.Shared 
{ 
    public class NetSpecificFactory : INetSpecificFactory 
    { 
     public INetSpecific CreateSomething() 
     { 
      .... 
     } 
    } 
} 

だから共有ライブラリに

using Common.PCL; 
namespace Common.Shared 
{ 
    public class AutofacModule : Module 
    { 
     protected override void Load(ContainerBuilder builder) 
     { 
      builder.RegisterType<NetSpecificFactory>().As<INetSpecificFactory>(); 
     } 
    } 
} 

をautofacモジュールを追加し、私はDI経由で私のPCLでINetSpecificFactoryを使用することができます。リンクファイルを使用するよりも優れています(最初はオプションの1つでした)

関連する問題