प्लेटफ़ॉर्म WP7, WP8, Win8 के बीच कोड साझा करना। मूल बातें



अक्सर, आपको किसी मौजूदा एप्लिकेशन को अन्य प्लेटफार्मों पर पोर्ट करना होगा या शुरू में इसे एक साथ कई प्लेटफार्मों के लिए लिखना होगा। इस लेख में, हम विशेष रूप से तीन प्लेटफार्मों के लिए कोड साझा करने की मूल बातों पर विचार करेंगे, लेकिन वर्णित सिद्धांत अन्य प्लेटफार्मों पर क्रॉस-प्लेटफ़ॉर्म अनुप्रयोगों को विकसित करने के लिए लागू होते हैं, उदाहरण के लिए, ज़मारिन का उपयोग करना।

चूंकि सामग्री काफी मात्रा में थी, इसलिए मैंने लेख को दो भागों में विभाजित करने का निर्णय लिया। आज हम शुरुआती लोगों के लिए साझा करने की मूल बातों पर विचार करेंगे, और यदि आपके पास पहले से ही बुनियादी कौशल हैं, तो आप सुरक्षित रूप से इस लेख को छोड़ सकते हैं और अगले की प्रतीक्षा कर सकते हैं, जहां व्यवहार में हम कोड साझा करने के अधिक जटिल परिदृश्यों पर विचार करेंगे।

और अब मैं कोड साझा करने के दो मुख्य तरीकों के बारे में बात करूंगा: फ़ाइलों और एक पुस्तकालय को आम कोड के साथ जोड़ना। हम लगातार दोनों दृष्टिकोणों, उनमें से प्रत्येक के मुख्य फायदे और नुकसान पर विचार करेंगे।

0. कॉपी

बेशक, आप "साझाकरण" कोड के एक और लोकप्रिय तरीके के बारे में कुछ शब्द कहे बिना लिंकिंग से शुरू नहीं कर सकते हैं - कॉपी करना। एक विशिष्ट प्लेटफ़ॉर्म के लिए कोडिंग और संशोधन करना "साझा" करने का सबसे आसान तरीका है, और कुछ स्थानों पर सबसे अधिक संभावना है कि हम आंशिक रूप से इस दृष्टिकोण का उपयोग करेंगे। लेकिन हम इसे इस तथ्य के कारण साझा करने के मुख्य सिद्धांत के रूप में नहीं मानेंगे कि इसमें प्लसस की तुलना में अधिक minuses हैं। दृष्टिकोण के लाभ: हम जल्दी से दूसरे प्लेटफॉर्म के लिए काम कर रहे कोड प्राप्त करते हैं और साथ ही, हमारे परिवर्तन किसी भी तरह से मुख्य प्लेटफॉर्म को प्रभावित नहीं कर सकते हैं। विपक्ष: रखरखाव महंगा है, क्योंकि आपको प्रत्येक प्लेटफ़ॉर्म के लिए प्रत्येक कॉपी में पहले से ही उसी प्रकार के बदलाव करने होंगे।

1. लिंकिंग

क्रॉस-प्लेटफ़ॉर्म एप्लिकेशन लिखने का सबसे आसान और शायद सबसे लोकप्रिय तरीका फाइलों को लिंक करना है। अक्सर, जब हमारे पास पहले से ही WP7 के लिए एक तैयार आवेदन होता है और WP8 (या इसके विपरीत) के लिए एक ही आवेदन प्राप्त करना चाहते हैं, तो मौजूदा कोड का पुन: उपयोग करने और मौजूदा एप्लिकेशन आर्किटेक्चर में कोई बदलाव नहीं करने के लिए एक महान प्रलोभन है (यदि वास्तुकला इसके लिए अनुरूप नहीं था। )।

आइए इस कदम पर एक नज़र डालें।

उदाहरण के लिए, आइए एक बहुत ही सरल WP8 एप्लिकेशन बनाएं और मुख्य पृष्ठ (MainPage.Xaml) पर क्लासिक "कैलकुलेटर" जोड़ें - नंबर दर्ज करने के लिए दो टेक्स्ट फ़ील्ड, एक अतिरिक्त बटन और परिणाम प्रदर्शित करने के लिए एक फ़ील्ड।

<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 के लिए एक नए प्रोजेक्ट को सॉल्टियन (फाइल - एड - न्यू प्रोजेक्ट - विंडोज फोन ऐप - विंडोज फोन 7) से जोड़ना होगा।

उसके बाद, आपको WP7 प्रोजेक्ट से MainPage.xaml को निकालना होगा और WP8 प्रोजेक्ट से MainPage.xaml का लिंक जोड़ना होगा।

WP7 प्रोजेक्ट (राइट-क्लिक) पर संदर्भ मेनू में, जोड़ें - मौजूदा आइटम का चयन करें।



अगला, WP8 के प्रोजेक्ट फ़ोल्डर में, हमें MainPage.xaml फ़ाइल (केवल यह फ़ाइल, .cs फ़ाइल स्वचालित रूप से जोड़ी जाएगी) मिल जाती है और Add As Link चुनें।

अंततः, आपको अपनी परियोजना में कुछ इस तरह से मिलना चाहिए:



द्वारा और बड़े, हमें एक समान कोड के साथ एक परियोजना मिली, और उसी तरह हम लिंक कर सकते हैं, यदि आवश्यक हो, तो चित्र या app.xll भी। अब हम परियोजना में परिवर्तन कर सकते हैं (उदाहरण के लिए, संख्या प्रविष्टि सत्यापन जोड़ें) और दोनों परियोजनाओं में एक ही बार में इन परिवर्तनों को प्राप्त करें।

मैं यह भी सलाह देता हूं कि दोनों परियोजनाओं के लिए गुण समान नामस्थान निर्दिष्ट करें।

जल्दी या बाद में, हम प्रत्येक प्लेटफ़ॉर्म की सुविधाओं का सामना करेंगे। हम #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 पर async / प्रतीक्षा का त्याग करें, या WP7 पर async का समर्थन करें।

बेशक, हम अच्छाईयों को मना नहीं करना चाहते हैं, इसलिए पहले हम Microsoft को स्थापित करेंगे। WP7 पर क्लिक करें, async का समर्थन करने के लिए एक परियोजना। हम इसे Nuget पैकेज मैनेजर (WP7 के साथ किसी प्रोजेक्ट पर क्लिक करने के लिए संदर्भ मेनू - NuGet Package प्रबंधित करें) या Nuget कंसोल के माध्यम से निम्न आदेश के साथ स्थापित कर सकते हैं (आप टूल -Net पैकेज प्रबंधक - पैकेज प्रबंधक कंसोल के माध्यम से स्टूडियो में कंसोल खोल सकते हैं):
स्थापित करें-पैकेज 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 / WINS प्रतीकों को पसंद करता हूं)।



जैसा कि आप देख सकते हैं, हम पहले से ही डिफ़ॉल्ट रूप से पंजीकृत WINDOWS_PHONE प्रतीक के अनुसार विंडोज 8 और विंडोज फोन प्लेटफार्मों को अलग कर सकते हैं।

अब जब हमारे पास संकलन प्रतीक हैं, तो हम विभिन्न प्लेटफार्मों के लिए अपने कोड को इस प्रकार विभाजित कर सकते हैं:

 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 के लिए परियोजनाएं हैं, आप एक अलग विंडोज फोन 7 लाइब्रेरी में कॉमन कोड का चयन कर सकते हैं और दो प्रोजेक्ट्स के लिए इस लाइब्रेरी का उपयोग कर सकते हैं। ऐसा करने के लिए, एक नया प्रोजेक्ट जोड़ें (फ़ाइल - एड-न्यू प्रोजेक्ट) विंडोज फोन क्लास लाइब्रेरी, विंडोज फोन 7 प्लेटफॉर्म का चयन करें और कैलकुलेटर के साथ हमारे उदाहरण में कॉल करें, उदाहरण के लिए, कैलक्यूलेटरकोर।

इस प्रोजेक्ट में पेज जोड़ने के लिए, आपको Microsoft.Phone लाइब्रेरी में एक लिंक डालना होगा:



विधानसभाओं में - फ्रेमवर्क टैब:



अगला कदम WP7 और WP8 परियोजनाओं में कैलक्यूलेटर कोर परियोजना के लिए एक लिंक जोड़ना है।

संदर्भों में से प्रत्येक परियोजना के लिए, हम इसी तरह परियोजना के लिए एक लिंक जोड़ते हैं, जो समाधान टैब में पाया जा सकता है:



अब हम अपने मेनपेज पेज को इस साझा लाइब्रेरी में स्थानांतरित कर सकते हैं।

यदि सब कुछ सही ढंग से किया गया था, तो आपकी परियोजना की संरचना इस तरह दिखाई देगी:



उसी तरह, सामग्री, स्थानीयकरण, उपयोगकर्ताकंट्रोल आदि को साझा पुस्तकालय में स्थानांतरित किया जा सकता है।

प्रोजेक्ट के कार्य करने के लिए, अंतिम चरण बना हुआ है: प्रोजेक्ट के लिए इस पृष्ठ को किसी अन्य असेंबली में खोजने के लिए, आपको प्रत्येक प्रोजेक्ट में पूर्ण लिंक को प्रकट फ़ाइलों (WMAppManifest.xml फ़ाइल) में जोड़ना होगा।

यानी लिंक के बजाय:

/>

पूर्ण पथ को पंजीकृत करना आवश्यक है:

/>

अब, यदि हम प्रोजेक्ट चलाते हैं, तो हम अपना पेज देखेंगे। इस प्रकार, हमें दो अलग-अलग परियोजनाएं मिलीं, जहां हमारे पास एक सामान्य कार्य कोड है। अगले लेख में, हम प्रत्येक प्लेटफ़ॉर्म की सुविधाओं का उपयोग करने का तरीका देखेंगे।

2.2। पोर्टेबल लाइब्रेरी

अक्सर हमें कई WP7 / WP8 / Win8 प्लेटफार्मों के बीच कोड को "फूटना" पड़ता है, जिसमें अलग-अलग UI हैं, लेकिन एक सामान्य तर्क है।

इस मामले में, सामान्य WP7 पुस्तकालय, निश्चित रूप से, हमारे लिए काम नहीं करेगा। इसके बजाय, हम पोर्टेबल लाइब्रेरी जैसी परियोजना का उपयोग कर सकते हैं (इस प्रकार की परियोजना विंडोज टेम्पलेट्स में पाई जा सकती है और विंडोज फोन नहीं):



जैसा कि आप देख सकते हैं, हम सामान्य कोड का उपयोग एंड्रॉइड और आईओएस के साथ भी कर सकते हैं, यदि हम उपयोग करते हैं, उदाहरण के लिए, ज़मरीन ("शुद्ध" रूप में, स्टूडियो बिना अंक के एंड्रॉइड और आईओएस प्रदान करता है)

यहां हम चुन सकते हैं कि हमारे पास किस प्रकार की परियोजनाएं होंगी, और साथ ही हम केवल उन प्लेटफ़ॉर्म सुविधाओं का उपयोग करेंगे जो सभी चयनित प्रकार की परियोजनाओं में हैं।

Msdn वेबसाइट पर समर्थित सुविधाओं की अधिक विस्तृत सूची पाई जा सकती है। या, यदि आप उपयोग करते हैं, तो ज़मारिन

यहां हम इस लाइब्रेरी के बारे में विस्तार से नहीं बताएंगे, क्योंकि इसके अगले हिस्से में ज्यादातर उदाहरण पोर्टेबल लाइब्रेरी से जुड़े होंगे।

निष्कर्ष

व्यवहार में, बहुत सारे लोग और टीम कोड साझा करने के लिए सलाह लेते हैं और शायद चयन प्रस्तुत करने योग्य नहीं है, लेकिन मैंने देखा कि अधिकांश नौसिखिए डेवलपर्स फाइलों को लिंक करना पसंद करते हैं।

सामान्य तौर पर, फ़ाइलों को लिंक करके साझा करने की लोकप्रियता इस दृष्टिकोण के कार्यान्वयन की सादगी और गति के कारण है। ज्यादातर मामलों में, आपको कोड को रीफ़्रैक्टर करने की आवश्यकता नहीं है, और आप मौजूदा कोड ले सकते हैं, संकलन प्रतीकों के छोटे आवेषण बना सकते हैं, जल्दी से प्लेटफ़ॉर्म सुविधाओं का उपयोग कर सकते हैं। इसके विपरीत, सामान्य कोड वाली एक लाइब्रेरी अक्सर प्लेटफ़ॉर्म सुविधाओं के एक साधारण पृथक्करण की अनुमति नहीं देती है, और अगले भाग में हम इस बिंदु पर विस्तार से ध्यान देंगे।

फ़ाइल लिंकिंग दृष्टिकोण में दो महत्वपूर्ण कमियां हैं, यही वजह है कि मैं इसका उपयोग नहीं करने की कोशिश करता हूं:

  1. बड़ी परियोजनाओं में, कोड को फिर से भरना और बनाए रखना बहुत जटिल है, क्योंकि कंपाइलर और स्टूडियो सिर्फ कोड को नहीं देखते हैं, जिसे एक संकलन प्रतीक द्वारा अलग किया जाता है।
  2. एक नया प्लेटफ़ॉर्म या नया सॉफ़्टवेयर जोड़ते समय, इस कोड का उपयोग करने के लिए हमें इन सभी परिवर्तनों को बार-बार करना होगा, अक्सर सभी संकलन प्रतीकों में बदलाव करना होगा। कोड रखरखाव कई बार जटिल होता है।


साझा पुस्तकालय दृष्टिकोण का मुख्य दोष यह है कि अधिक कोड की आवश्यकता है (हालांकि यह रखरखाव में आसानी से अधिक है)। इसके अलावा, खराब कोड गुणवत्ता वाली परियोजनाओं के लिए, यह विधि उपयुक्त नहीं है। विभिन्न टीमों के परामर्श के दौरान, मैं बार-बार इस तथ्य के बारे में आया कि एक सामान्य पुस्तकालय का उपयोग करने के लिए, टीमों को परियोजना को "साफ" करने के लिए एक बड़ा और बड़ा काम करना था। लेकिन दूसरी ओर, यह सोचने की आवश्यकता है कि कोड को साझा करने की आवश्यकता है और इसके लिए यह आवश्यक है कि सामान्य तर्क को अप्रत्यक्ष रूप से कोड की गुणवत्ता में सुधार के लिए प्रेरित किया जाए।

अपडेट किया गया
बिल्ड कॉन्फ्रेंस में, एक नए प्रकार के UniversalApps प्रोजेक्ट को दिखाया गया, जिससे आप W8.1 और WP8.1 के लिए एक ही एप्लिकेशन बना सकते हैं। विवरण अद्भुत लेखक शवर्स द्वारा लिखे गए लेख में पाया जा सकता है

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


All Articles