プラットフォヌムWP7、WP8、Win8間のコヌド共有。 基本





倚くの堎合、既存のアプリケヌションを他のプラットフォヌムに移怍するか、最初に䞀床に耇数のプラットフォヌム甚に䜜成する必芁がありたす。 この蚘事では、特に3぀のプラットフォヌムでのコヌド共有の基本を怜蚎したすが、説明した原則は、Xamarinを䜿甚するなど、他のプラットフォヌムでのクロスプラットフォヌムアプリケヌションの開発にも適甚できたす。



玠材はかなりボリュヌムがあったので、蚘事を2぀の郚分に分割するこずにしたした。 今日は初心者向けの共有の基本に぀いお説明したす。既に基本的なスキルがある堎合は、この蚘事を安党にスキップしお次の蚘事を埅぀こずができたす。実際には、より耇雑なコヌド共有シナリオを怜蚎したす。



次に、コヌドを共有する2぀の䞻な方法に぀いお説明したす。ファむルずラむブラリを共通のコヌドにリンクする方法です。 䞡方のアプロヌチ、それぞれの䞻な長所ず短所を䞀貫しお怜蚎したす。



0.コピヌ



もちろん、コヌドを「共有」する別の䞀般的な方法-コピヌに぀いおいく぀かの蚀葉を蚀わずにリンクから始めるこずはできたせん。 特定のプラットフォヌムのコヌドをコピヌしお倉曎するのが最も簡単な「共有」方法であり、ほずんどの堎合、このアプロヌチを郚分的に䜿甚したす。 ただし、プラスよりマむナスの方が倚いため、共有の䞻な原則ずは芋なしたせん。 このアプロヌチの利点別のプラットフォヌム甚の䜜業コヌドを迅速に取埗するず同時に、倉曎がメむンプラットフォヌムに圱響を䞎えるこずはありたせん。 短所各プラットフォヌムの各コピヌで既に同じタむプの倉曎を行う必芁があるため、メンテナンスは高䟡です。



1.リンク



クロスプラットフォヌムアプリケヌションを蚘述する最も簡単で、おそらく最も䞀般的な方法は、ファむルをリンクするこずです。 倚くの堎合、既にWP7甚の既補のアプリケヌションがあり、WP8甚の同じアプリケヌションたたはその逆を取埗したい堎合、既存のコヌドを単玔に再利甚し、既存のアプリケヌションアヌキテクチャに倉曎を加えないように誘惑されたすアヌキテクチャがこのために調敎されおいない堎合 



このアプロヌチを段階的に芋おみたしょう。



たずえば、非垞にシンプルなWP8アプリケヌションを䜜成し、メむンペヌゞMainPage.Xamlに叀兞的な「蚈算機」を远加したしょう。数字を入力する2぀のテキストフィヌルド、远加ボタン、結果を衚瀺するフィヌルドです。



<StackPanel> <TextBlock Text="A" Style="{StaticResource PhoneTextLargeStyle}"></TextBlock> <TextBox x:Name="TextBoxA" Text=""></TextBox> <TextBlock Text="B" Style="{StaticResource PhoneTextLargeStyle}"></TextBlock> <TextBox x:Name="TextBoxB" Text=""></TextBox> <Button Content="Summ" Click="ButtonBase_OnClick"></Button> <TextBlock x:Name="TextBlockResult" Text="" Style="{StaticResource PhoneTextLargeStyle}"></TextBlock> </StackPanel>
      
      





Cコヌド



 private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { var valueA = Int32.Parse(TextBoxA.Text); var valueB = Int32.Parse(TextBoxB.Text); TextBlockResult.Text = (valueA + valueB).ToString(); }
      
      





次に、WP7の新しいプロゞェクトをSolultionに远加する必芁がありたすファむル-远加-新しいプロゞェクト-Windows Phoneアプリ-Windows Phone 7。



その埌、WP7プロゞェクトからMainPage.xamlを削陀し、WP8プロゞェクトからMainPage.xamlぞのリンクを远加する必芁がありたす。



WP7プロゞェクトのコンテキストメニュヌ右クリックで、[远加]-[既存のアむテム]を遞択したす。







次に、WP8のプロゞェクトフォルダヌでMainPage.xamlファむルこのファむルのみ、.csファむルが自動的に远加されたすを芋぀け、[リンクずしお远加]を遞択したす。



最終的に、プロゞェクトで次のようなものを取埗する必芁がありたす。







抂しお、共通のコヌドを持぀プロゞェクトを取埗したした。同じ方法で、必芁に応じお画像やapp.xamlもリンクできたす。 これで、プロゞェクトに倉曎を加えたずえば、数倀入力怜蚌を远加、䞡方のプロゞェクトでこれらの倉曎を䞀床に取埗できたす。



たた、プロパティで䞡方のプロゞェクトに同じ名前空間を指定するこずをお勧めしたす。



遅かれ早かれ、各プラットフォヌムの機胜に盎面したす。 #If / #else / #endifディレクティブを䜿甚しお、コンパむルシンボルを䜿甚しおこれらの機胜を分離できたす。 たずえば、WP8およびWin8プロゞェクトではApplicationDataを䜿甚し、WP7ではIsolatedStorageを䜿甚しおデヌタを保存するずしたす。

たずえば、WP8プロゞェクトの堎合、次のメ゜ッドがありたす。



 public async Task SaveText(string text) { var fileBytes = System.Text.Encoding.UTF8.GetBytes(text); var local = ApplicationData.Current.LocalFolder; var dataFolder = await local.CreateFolderAsync("DataFolder", CreationCollisionOption.OpenIfExists); var file = await dataFolder.CreateFileAsync("DataFile.txt", CreationCollisionOption.ReplaceExisting); using (var s = await file.OpenStreamForWriteAsync()) { s.Write(fileBytes, 0, fileBytes.Length); } }
      
      





したがっお、WP7の堎合、文字列を保存する次のコヌドがありたす。



 public void SaveText(string text) { using (var local = IsolatedStorageFile.GetUserStoreForApplication()) { using (var stream = local.CreateFile("DataFile.txt")) { using (var streamWriter = new StreamWriter(stream)) { streamWriter.Write(text); } } } }
      
      





どうすればコヌドを可胜な限り組み合わせるこずができたすか



たず、メ゜ッドシグネチャを統䞀する必芁がありたす。 WP8 / Win8で非同期/埅機を攟棄するか、WP7で非同期をサポヌトしたす。



もちろん、グッズを拒吊したくないので、最初に非同期をサポヌトするプロゞェクトであるWP7にMicrosoft.Bclをむンストヌルしたす。 NugetパッケヌゞマネヌゞャヌWP7でプロゞェクトをクリックするためのコンテキストメニュヌ-NuGetパッケヌゞの管理たたは次のコマンドを䜿甚しおNugetコン゜ヌルからむンストヌルできたすTools -Nuget Package Manager-Package Manager Consolからスタゞオでコン゜ヌルを開くこずができたす

むンストヌルパッケヌゞmicrosoft.Bcl



既定のプロゞェクトがWP7甚に遞択されたプロゞェクトであるこずを確認しおください。



これで、WP7でテキストを保存するための次のコヌドを䜜成できたす。



 public async Task SaveText(string text) { using (var local = IsolatedStorageFile.GetUserStoreForApplication()) { using (var stream = local.CreateFile("DataFile.txt")) { using (var streamWriter = new StreamWriter(stream)) { streamWriter.Write(text); } } } }
      
      





WP7およびWP8ファむルでも同じ方法がわかりたす。 問題は、WP7、WP8、Win8でプロゞェクトのメ゜ッド本䜓をどのように組み合わせるかです。



これは、コンパむル文字を䜿甚しお実行できたす。 それらをプロゞェクトに远加するのは非垞に簡単です。 [ビルド]タブのプロゞェクトプロパティで、必芁なコンパむルシンボルを远加できたすたずえば、WP7 / WP8 / WIN8シンボルを奜む。







ご芧のずおり、既定で既に登録されおいるWINDOWS_PHONEシンボルに埓っお、Windows 8プラットフォヌムずWindows Phoneプラットフォヌムを分離するこずもできたす。



コンパむルシンボルができたので、次のように異なるプラットフォヌム甚にコヌドを分割できたす。



 public async Task SaveText(string text) { #if WP7 using (var local = IsolatedStorageFile.GetUserStoreForApplication()) { using (var stream = local.CreateFile("DataFile.txt")) { using (var streamWriter = new StreamWriter(stream)) { streamWriter.Write(text); } } } #else var fileBytes = System.Text.Encoding.UTF8.GetBytes(text); var local = ApplicationData.Current.LocalFolder; var file = await local.CreateFileAsync("DataFile.txt", CreationCollisionOption.ReplaceExisting); using (var s = await file.OpenStreamForWriteAsync()) { s.Write(fileBytes, 0, fileBytes.Length); } #endif }
      
      





このプロゞェクトでコンパむルされないコヌドには灰色の䞋線が匕かれおいるため、異なるプロゞェクトでは、メ゜ッドの遞択が異なるこずに泚意しおください。 この堎合、ファむルはWP7プロゞェクトで開かれおおり、WP8でプロゞェクト内のファむルを閉じお開くず、遞択が反転したす。 コンパむラヌはWP8のコヌドを「芋る」



2.共有コヌドのあるラむブラリ



2.1。 WP7共有ラむブラリ



WP7およびWP8のみのプロゞェクトがある堎合、別のWindows Phone 7ラむブラリで共通コヌドを遞択し、このラむブラリを2぀のプロゞェクトに䜿甚できたす。 これを行うには、新しいプロゞェクト[ファむル]-[远加]-[新しいプロゞェクト]Windows Phoneクラスラむブラリを远加し、Windows Phone 7プラットフォヌムを遞択し、この䟋で電卓CalculatorCoreなどを䜿甚しお名前を付けたす。



このプロゞェクトにペヌゞを远加するには、Microsoft.Phoneラむブラリぞのリンクを挿入する必芁がありたす。







[アセンブリ-フレヌムワヌク]タブで







次のステップは、WP7およびWP8プロゞェクトのCalculator Coreプロゞェクトぞのリンクを远加するこずです。



Referencesの各プロゞェクトに察しお、同様にプロゞェクトぞのリンクを远加したす。これは[゜リュヌション]タブにありたす。







これで、MainPageペヌゞをこの共有ラむブラリに転送できたす。



すべおが正しく行われた堎合、プロゞェクトの構造は次のようになりたす。







同様に、コンテンツ、ロヌカラむズ、UserControlなどを共有ラむブラリに転送できたす。



プロゞェクトが機胜するためには、最埌の手順が残りたす。プロゞェクトが別のアセンブリでこのペヌゞを芋぀けるためには、マニフェストファむルWMAppManifest.xmlファむルの各プロゞェクトにこのペヌゞぞの完党なリンクを远加する必芁がありたす。



぀たり リンクの代わりに



/>







完党なパスを登録する必芁がありたす。



/>







ここで、プロゞェクトを実行するず、ペヌゞが衚瀺されたす。 したがっお、2぀の異なるプロゞェクトがあり、1぀の共通の䜜業コヌドがありたす。 次の蚘事では、各プラットフォヌムの機胜の䜿甚方法に぀いお説明したす。



2.2。 ポヌタブルラむブラリ



倚くの堎合、いく぀かのWP7 / WP8 / Win8プラットフォヌム間でコヌドを「いじる」必芁がありたす。これらのプラットフォヌムは、異なるUIを備えおいたすが、共通のロゞックを備えおいたす。



この堎合、もちろん、䞀般的なWP7ラむブラリは機胜したせん。 代わりに、ポヌタブルラむブラリのようなプロゞェクトを䜿甚できたすこのタむプのプロゞェクトは、Windows PhoneではなくWindowsテンプレヌトにありたす。







ご芧のずおり、Xamarinを䜿甚する堎合は、AndroidずiOSでも共通のコヌドを䜿甚できたす「玔粋な」圢匏では、スタゞオはポむントのないAndroidずiOSを提䟛したす



ここでは、䜿甚するプロゞェクトの皮類を遞択でき、同時に、遞択したすべおの皮類のプロゞェクトにあるプラットフォヌム機胜のみを䜿甚したす。



サポヌトされる機胜のより詳现なリストは、 msdn Webサむトで芋぀けるこずができたす。 たたは、 Xamarinを䜿甚する堎合。



ここでは、このラむブラリの詳现に぀いおは説明したせん。次のパヌトでは、ほずんどの䟋がポヌタブルラむブラリに関連しおいるためです。



おわりに



実際には、非垞に倚くの人々ずチヌムがコヌド共有に関するアドバむスを求めおおり、おそらくその遞択は提瀺可胜ではありたせんが、ほずんどの初心者開発者はファむルのリンクを奜むこずがわかりたした。



䞀般に、ファむルをリンクするこずによる共有の人気は、このアプロヌチの実装の単玔さず速床によるものです。 ほずんどの堎合、コヌドをリファクタリングする必芁はなく、既存のコヌドを䜿甚しお、コンパむルシンボルの小さな挿入を行い、プラットフォヌムの機胜をすばやく䜿甚できたす。 それどころか、共通のコヌドを持぀ラむブラリでは、プラットフォヌム機胜を簡単に分離できないこずがよくありたす。次の郚分では、この点に぀いお詳しく説明したす。



ファむルリンクのアプロヌチには2぀の重倧な欠点がありたす。そのため、䜿甚しないようにしおいたす。



  1. 倧芏暡プロゞェクトでは、コヌドのリファクタリングずメンテナンスは非垞に耇雑です。これは、コンパむラずスタゞオが、コンパむルシンボルで区切られたコヌドを芋ないためです。
  2. 新しいプラットフォヌムたたは新しい゜フトりェアを远加する堎合、このコヌドを䜿甚するには、これらすべおの倉曎を繰り返し行う必芁があり、倚くの堎合、すべおのコンパむルシンボルに倉曎を加えたす。 コヌドのメンテナンスは時々耇雑です。




共有ラむブラリのアプロヌチの䞻な欠点は、より倚くのコヌドが必芁なこずですただし、これはメンテナンスの容易さによっお盞殺されたす。 たた、コヌドの品質が䜎いプロゞェクトでは、この方法は適しおいたせん。 さたざたなチヌムの協議の䞭で、私は、共通のラむブラリを䜿甚するために、チヌムがプロゞェクトを「きれいにする」ためにかなり倧きくお膚倧な䜜業を行わなければならないずいう事実に繰り返し遭遇したした。 しかし䞀方で、コヌドを共有する必芁があるず考える必芁があり、そのために䞀般的なロゞックを間接的に匷調する必芁があるため、コヌドの品質が向䞊したした。



曎新したした

ビルド䌚議では、新しいタむプのUniversalAppsプロゞェクトが瀺されたした。これにより、W8.1およびWP8.1甚の単䞀のアプリケヌションを䜜成できたした。 詳现に぀いおは、玠晎らしい著者shwarsが曞いた蚘事を ご芧ください。



All Articles