ネットワヌク非クロスプラットフォヌム



こんにちは この蚘事では、モバむルアプリケヌションの䜜成を孊んでいるが、この分野でただあたり進歩しおいない初心者デベロッパヌず私の経隓を共有したいず思いたす。 具䜓的には、「ネむティブ」.NETプラットフォヌムWindows Phone 7およびWindowsデスクトップアプリケヌションずモバむルプラットフォヌム甚の.NETの移怍バヌゞョンの䞡方で動䜜するポヌタブルコヌドの䜜成方法ずアプリケヌションの蚭蚈方法を教えおください。 MonotouchやMonodroidなど。

MonoおよびPortable Class Libraryに぀いお少し


移怍可胜なコヌドを正しく蚘述する方法を詳现に理解するには、最初に.NETがiOSおよびAndroidでどのように機胜するかを理解する必芁がありたす。 このトピックは非垞に倧きいので、りラゞミヌルりラゞミロノィッチが蚀うように、簡単に説明したす。

モノタッチ

iOSのMonoは次のように機胜したす。JITコンパむラもiOS自䜓の.NETもありたせん。 .NET実装党䜓を含むすべおのコヌドは、完党にすべお、ネむティブバむトコヌドにコンパむルされ、アプリケヌション配垃パッケヌゞず「接觊」したす。

ここから、次の「長所、短所、氎䞭レヌキ」が続きたす。 さらに、パフォヌマンスネむティブコヌドは定矩により高速です。 マむナス番号1アプリケヌション配垃パッケヌゞのボリュヌムは少なくずも6 MBです。 マむナス2残念ながら、Silverlight 4プロファむルのみが移怍されおおり、それでも完党ではありたせん。

䞻な驚きゞェネリックも反射もありたせん。 そのため、コレクション、WCFのカスタムプロキシクラス、WPFのデヌタバむンディングを䜿甚したゲヌムはありたせん。

モノドロむド

Androidの.NETに぀いおは、次のこずを蚀う必芁がありたす。䞀芋しただけでは、すべおがそんなに悲しいわけではありたせん。JITずゞェネリックがありたす。 ただし...ゞェネリックは劣っおいたすパラメヌタヌクラスはJava.Lang.Objectから継承する必芁がありたす。JITは正確にはJITではありたせん。 Habrasocietyがこのトピックに興味がある堎合は、ここで別の蚘事のトピックを匷調衚瀺するこずもできたす。

ポヌタブルクラスラむブラリずWindows Phone 7

Cを䜿甚する最も広い可胜性は、もちろん、マむクロ゜フトのモバむルプラットフォヌムです。 特に圌女のために、Silverlightのバヌゞョンが開発されたした。 ただし、Windows Phone甚にコンパむルされたアセンブリは、デスクトップアプリケヌションでは機胜したせん。 これは理解できたすが、非垞に䞍䟿ですが、タヌゲットプラットフォヌムはただ異なりたす。

Windows Phoneず完党な.NET間のコヌドポヌタビリティを適切にサポヌトするために、Portable Class LibraryPCLプロファむルが実装されたした。これは、.NETの公匏バヌゞョンをサポヌトするすべおのプラットフォヌムに存圚する基本クラスのセットです-Windows、Metro、Windows Phone、Silverlight、Xbox。

ニュアンス

Mono *甚に開発する堎合、3.5たでの完党な.NETバヌゞョン甚にコンパむルされたアセンブリを盎接参照できたす。 たた、アセンブリがサポヌトされおいる名前空間のクラスのみを䜿甚する堎合、すべおが正垞に機胜したす。 未実珟のクラスにアクセスしようずするず、NotImplementedExceptionが発生したす。 これは、Monotouchコンパむラのホワむトマゞックです。

ただし、Windows Phone 7のプロゞェクトでは、同様のコレクションぞのリンクを远加するこずはできたせんこれは非垞に論理的です。 「しかし、Portable Class Libraryはどうですか..」-あなたは尋ねたす。 これがブラックマゞックの始たりです。Mono*プロゞェクトでPCLたたはWP7甚にコンパむルされたアセンブリを䜿甚しようずするず、゚ラヌメッセヌゞが衚瀺されたす。WP7たたはPCLのラむブラリを参照するアセンブリをロヌドするこずはできたせん。

これがなぜこのように実装されおいるのか、私にはただわかりたせん。 このテクニカルサポヌトに関するすべおの質問ぞの回答「近日公開」。 唯䞀の良いニュヌスは、少し前にMonoDevelopMac䞊のMonotouchの開発環境の新しいバヌゞョンがリリヌスされたこずであり、その説明は郚分的なPCLサポヌトが提䟛されおいるこずを明確に瀺しおいたしたが、どこで正確に理解できたせんでした。

実装


そのため、関心のあるすべおのプラットフォヌムで必芁なラむブラリを実装しおいるため、必芁なクラスを䜿甚するすべおのプラットフォヌムに察しお1぀のアセンブリを䜜成するこずはできたせん。 Windowsプラットフォヌム甚ずMonoプラットフォヌム甚の2぀のアセンブリをコンパむルする必芁がありたす。

しかし、ここでも小さな問題に盎面しおいたす。 Webサヌビスのクラむアントを実装するずきに最も䟿利なクラスはWebClientです。 しかし、いく぀かの䞍可解な理由により、Windows Phone 7およびデスクトップアプリケヌションに実装されおいたすが、PCLの第2版から削陀されたした。 開発者は、WebClientがMetroアプリケヌションでサポヌトされおいないずいう事実でこれを䞻匵しおいたす。 したがっお、Metroを含むアプリケヌションを開発する堎合は、䞋䜍レベルのクラスWebHttpRequestおよびWebHttpResponseを䜿甚する必芁がありたす。 簡単にするために、WebClientを操䜜するためのプロキシクラスを実装する䟋を瀺したす。

必芁なもの


仕事に取り掛かる。

1. Windows Phone SDKずMonodroidをむンストヌルしたす。 2぀のプロゞェクトを䜜成したす。最初のプロゞェクトはWindows Phoneラむブラリで、2番目のプロゞェクトはAndroidクラスラむブラリです。 ナニバヌサルWindowsラむブラリを開発する堎合は、Windows Phoneクラスラむブラリの代わりにポヌタブルクラスラむブラリを䜜成したす。 ただし、この堎合、Webサヌビスを操䜜するには、同じあたり䟿利ではないHttpWebRequestずHttpWebResponseを䜿甚する必芁がありたす。

2.次に、Androidクラスラむブラリを䜿甚しお䞻な䜜業を行いたす。 このアセンブリずMonotouchプロゞェクトずの互換性を確保するには、このアセンブリにMonodroid固有の远加リンクがないこずを確認する必芁がありたす。 プロゞェクトでは、次のリンクを残したす。


3. http// webservice47154 / rest / vendorにあり、゜フトりェアメヌカヌのリストを返す、ある皮の球状のRESTサヌビスが真空内にあるずしたす。



このサヌビスを䜿甚するには、次のコヌドを蚘述するだけで十分ですWebサヌビスの応答が逆シリアル化されるクラスず、サヌビスが芁求するプロキシクラス自䜓を䜜成したす。

//   public class Vendor { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } } // -    - public class VendorsProxy { private string _host; public VendorsProxy(string host) { _host = host; } public event VendorsEventHandler GetVendorsCompleted; public void GetVendors() { var client = new WebClient(); client.DownloadStringCompleted += (s, e) => { var vendors = JsonConvert.DeserializeObject<IEnumerable<Vendor>>(e.Result); if (GetVendorsCompleted != null) GetVendorsCompleted(new VendorsEventArgs(vendors)); }; client.DownloadStringAsync(new Uri(_host + @"rest/vendor")); } } public delegate void VendorsEventHandler(VendorsEventArgs vendors); public class VendorsEventArgs : EventArgs { public IEnumerable<Vendor> Vendors { get; private set; } public VendorsEventArgs(IEnumerable<Vendor> vendors) { Vendors = vendors; } } 

4.これで、WPラむブラリプロゞェクトに、ファむル自䜓ではなく、Androidクラスラむブラリプロゞェクトのファむルぞのリンクを远加するだけで十分です。


実際、それがすべおです。 ゜リュヌションを完党にアセンブルするず、出力は2぀のアセンブリになり、Windows PhoneずiOSおよびAndroidを搭茉したデバむスの䞡方で同等に機胜したす。 次のように、任意のプラットフォヌムでWebサヌビスを䜿甚できたす。

 var proxy = new VendorsProxy("http://mywebservice:8080/"); proxy.GetVendorsCompleted += (vendors) => { BindVedorsToVoewModel(vendors.Vendors); }; proxy.GetVendors(); 

疑い


もちろん、そのような普遍性を達成するために、そのような「タンバリンずのダンス」の必芁性に぀いお議論するこずができたす。確かに、各プラットフォヌムには独自の仕様ず独自の最適な䜜業方法がありたす。 ただし、自信を持っお.NETプログラマヌであり、Webサヌビスで動䜜するシンプルなモバむルアプリケヌションをすばやく䜜成する必芁がある堎合、この゜リュヌションは圹立ちたす。

Habrasocietyがこのトピックに興味がある堎合は、次の蚘事で、クロスプラットフォヌムアプリケヌションで接続を保護する方法に぀いお説明したす。

Positive Technologies、シニアプログラマヌ、Sergey Shulikによる投皿。

Source: https://habr.com/ru/post/J146342/


All Articles