2011-04-16 10 views
5

मेरे पास सी # में लिखी एक मौजूदा लाइब्रेरी है जो बहुत कम स्तर के टीसीपी/आईपी एपीआई को लपेटती है और एक सर्वर (मालिकाना बाइनरी प्रोटोकॉल) से वायर के आने वाले संदेशों को .NET ईवेंट के रूप में प्रकट करती है। मैं किसी ऑब्जेक्ट पर विधि कॉल भी प्रदान करता हूं जो सुविधाजनक .NET प्रकारों (जैसे System.DateTime) को बाइनरी एन्कोडिंग और निश्चित-लंबाई संरचनाओं के लिए मार्शलिंग की जटिलताओं को नियंत्रित करता है जो API को (सर्वर पर आउटगोइंग संदेशों के लिए) की आवश्यकता होती है। इस .NET लाइब्रेरी के शीर्ष पर बनाए गए मौजूदा अनुप्रयोगों (आंतरिक रूप से और तृतीय पक्षों द्वारा उपयोग किए जाने वाले दोनों) की एक उचित संख्या है।सी # से जावा तक पोर्टिंग करने से बेहतर विकल्प?

हाल ही में, हम किसी ऐसे व्यक्ति से संपर्क कर चुके हैं जो टीसीपी/आईपी खुद को सारणीबद्ध करने के सभी स्तरों को नहीं करना चाहता, लेकिन उनका पर्यावरण सख्ती से गैर-विंडोज़ है (मुझे लगता है * निक्स, लेकिन मैं नहीं हूं 100% निश्चित), और उन्होंने सूचित किया है कि उनका आदर्श जावा से कुछ कॉल करने योग्य होगा।

सबसे अच्छा तरीका है उनकी आवश्यकताओं को समर्थन करने के लिए, मेरे लिए बिना क्या है: (एक अप्रबंधित DLL कि हम वर्तमान में पी/में विसंपीड़न के लिए आह्वान सहित)

  • किया है अब

    1. पोर्ट जावा के लिए कोड आगे जाकर दो अलग-अलग कोड-ठिकानों को बनाए रखने (यानी बनाने ही बग फिक्स और दो बार सुविधा वृद्धि)

    एक बात मैं करने पर विचार किया जा सकता है एक बार कोर टीसीपी/आईपी कार्यक्षमता के सबसे दोबारा लिखने के कुछ और में क्रॉस-प्लेटफ़ॉर्म (सी/सी ++) और n इस के शीर्ष पर एक पतली परत होने के लिए मेरी .NET लाइब्रेरी को बदलें (पी/Invoke?), और फिर इसके ऊपर एक समान पतली जावा परत भी लिखें (जेएनआई?)।

    सकारात्मक:

    • मैं ज्यादातर अपने समय लेखन बातें केवल एक बार खर्च करते हैं।

    विपक्ष:

    • कोड से अधिकांश अब अप्रबंधित होगा - दुनिया के अंत नहीं है, लेकिन (मेरे लिए) को देखने के एक बिंदु से उत्पादकता आदर्श नहीं।
    • लंबे समय तक विकास समय (कर सकते हैं C/C++ के रूप में जल्दी के रूप में सिर्फ जावा के लिए पोर्टिंग नहीं बंदरगाह सी # सॉकेट कोड)
    • इस बिंदु पर, अंतर्निहित एपीआई ज्यादातर लपेटा जाता है [कैसे सच है? है] और पुस्तकालय है बहुत स्थिर है, इसलिए शायद बहुत सारे नए विकास नहीं हैं - यह संभवतः जावा पर वर्तमान कोड को बंद करने के लिए बुरा नहीं हो सकता है और फिर कभी-कभी भविष्य में दो बार नए बग-फिक्स या नए फ़ील्ड का पर्दाफाश करना पड़ता है।
    • मेरे मौजूदा क्लाइंट अनुप्रयोगों के लिए संभावित अस्थिरता, जबकि संस्करण वे उनके नीचे भारी परिवर्तनों पर चल रहे हैं। (मेरे सिर के ऊपर से मैं 32/64 बिट मुद्दों, अंतहीनता के मुद्दों, और बंदरगाह के दौरान फसल की सामान्य बग आदि के बारे में सोच सकता हूं)

    एक और विकल्प जिसे मैंने संक्षेप में माना है वह किसी तरह से rigging है जावा पर मोनो, ताकि मैं पहले से मौजूद सभी मौजूदा सी # कोड का लाभ उठा सकूं। हालांकि, जावा डेवलपर्स के लिए डेवलपर अनुभव कितना आसान होगा, हालांकि मुझे इसका उपभोग नहीं करना पड़ेगा। मुझे पूरा यकीन है कि अधिकांश कोड मोनो के तहत बिना किसी परेशानी के चलते चलना चाहिए (डिकंप्रेशन पी/इनवॉक बार जिसे शायद सी # पर पोर्ट किया जाना चाहिए)।

    मैं आदर्श रूप से अपने कोड और क्लाइंट जावा ऐप के बीच टीसीपी/आईपी, पाइप इत्यादि की एक और परत जोड़ना नहीं चाहता हूं अगर मैं इसकी मदद कर सकता हूं (इसलिए जावा-साइड डब्ल्यूएस-डेथस्टार के लिए डब्ल्यूसीएफ संभवतः बाहर है) ।मैंने कभी जावा के साथ कोई गंभीर विकास नहीं किया है, लेकिन मुझे इस तथ्य में कुछ गर्व है कि पुस्तकालय वर्तमान में अपने आवेदन में एकीकृत करने के लिए किसी तीसरे पक्ष के डेवलपर के लिए केक का टुकड़ा है (जब तक वह चल रहा है .NET पाठ्यक्रम:)), और मैं किसी भी जावा डेवलपर्स के लिए समान उपयोग का उपयोग करने में सक्षम होना चाहता हूं जो समान अनुभव चाहते हैं।

    तो यदि किसी के पास प्रस्तावित 3 विकल्पों पर राय है (जावा & पोर्ट को दो बार बनाए रखें, सी को पोर्ट करें और .NET और जावा के लिए पतली भाषा बाइंडिंग लिखें या जावा और मोनो को एकीकृत करें, या कोई भी अन्य सुझाव मुझे उन्हें सुनना अच्छा लगेगा।

    धन्यवाद

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

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

    कुछ हफ़्ते के लिए इस बारे में सोच के बाद वापस मूल परिदृश्य के लिए हो रही है, मैं कुछ और टिप्पणियों की क्या ज़रूरत है:

    • शीर्ष पर अलग भाषा बाइंडिंग के साथ एक पोर्टेबल सी-आधारित पुस्तकालय शायद होगा अगर आप आगे जानते थे कि जाने के लिए आपको कई भाषाओं/प्लेटफार्मों का समर्थन करना होगा।

    • * निक्स पर, क्या एक प्रक्रिया एक जावा रनटाइम और एक मोनो रनटाइम दोनों को होस्ट कर सकती है? मैं .NET के पुराने संस्करणों में जानता हूं, आपके पास एक ही प्रक्रिया में दो अलग-अलग .NET रनटाइम नहीं हो सकते हैं, लेकिन मेरा मानना ​​है कि उन्होंने इसे .NET 4 के साथ ठीक कर दिया है? यदि यह संभव है, तो दोनों के बीच एक संवाद कैसे होगा? आदर्श रूप से आप एक स्थिर विधि कॉल और प्रतिक्रियाओं को बढ़ाने के लिए एक प्रतिनिधि के रूप में सरल कुछ चाहते हैं।

    • अगर वहाँ जावा & मोनो के बीच कोई आसान प्रत्यक्ष इंटरफ़ेस का समर्थन (तरीकों & प्रतिनिधियों, आदि) है, एक संदेश स्वरूप के रूप में प्रोटोकॉल बफ़र या अपाचे बचत के साथ ZeroMQ की तरह कुछ प्रयोग करने पर विचार हो सकता है। यह अलग-अलग परिवहन के लिए ज़ीरोएमक्यू के समर्थन के कारण नेटवर्क में प्रक्रिया, इंटर-प्रोसेस और नेटवर्क पर काम करेगा।

  • उत्तर

    2

    आवश्यकताओं क्रियान्वयन की दिशा में निर्णय लेने से पहले नीचे किसी न किसी हो रही अधिक समय बिताएं। जब तक आपको पता न हो कि क्या आवश्यक है, आपके पास डिज़ाइन के बीच चयन करने के लिए कोई मानदंड नहीं है।

    यदि यह एक गैर-विंडोज वातावरण है, तो यह कहीं भी .NET को कहीं भी समझ में नहीं आता है, उदाहरण के लिए।

    +0

    मैंने आपके उत्तर को सही के रूप में चिह्नित किया है, क्योंकि मेरी आवश्यकताओं को बदलना समाप्त हो गया है। हालांकि, मैं इससे बहुत संतुष्ट नहीं हूं - अभी भी परिदृश्य हो सकते हैं जहां व्यापक आवश्यकता विश्लेषण के बाद इस तरह के इंटरऑप की आवश्यकता होती है, इसलिए मुझे उम्मीद है कि एक बेहतर उत्तर स्वयं उपस्थित होगा। –

    +0

    संक्षिप्त उत्तर: नहीं, मुझे नहीं लगता कि सी # से जावा तक पोर्टिंग करने से बेहतर विकल्प हैं :) लेकिन यह उचित समाधान नहीं हो सकता है कि क्लाइंट को कोड की आवश्यकता है, वह कितना भुगतान करने के इच्छुक है, आदि । –

    1

    क्या आपने मोनो माना है? यह संभवतः गैर-विंडोज वातावरण में आपके मौजूदा कोड का समर्थन करेगा। चाल इसे जावा से बुलाएगी, लेकिन मोनो लोगों के पास भी आपकी मदद करने के लिए कुछ हो सकता है।

    1

    यह शायद अपने मामले में सही समाधान नहीं है, लेकिन पूर्णता के लिए:

    कुछ भाषाओं कि दोनों JVM और लक्षित कर सकते हैं कर रहे हैं।नेट, विशेष रूप से रूबी (JRuby और IronRuby) और अजगर (Jython और IronPython) में। अंततः स्कैला भी वहां पहुंच सकता है, हालांकि अभी .NET संस्करण JVM संस्करण के पीछे एक लंबा रास्ता है।

    वैसे भी, आप रूबी या पायथन में अपनी लाइब्रेरी को संभावित रूप से फिर से लिख सकते हैं और दोनों रनटाइम को लक्षित कर सकते हैं।

    0

    एक बात मैंने सोचा है कि कोर टीसीपी/आईपी कार्यक्षमता में से अधिकांश को फिर से कुछ और क्रॉस-प्लेटफार्म (सी/सी ++) में फिर से लिखना है और फिर मेरी .NET लाइब्रेरी को पतली परत में बदलना है इसके ऊपर (पी/Invoke?), और फिर इसके ऊपर एक समान पतली जावा परत भी लिखो (जेएनआई?)।

    यह एक संभावना है। जावा पक्ष पर, आपको जेएनआई के बजाय जेएनए का उपयोग करने पर विचार करना चाहिए। (यदि आप जेएनआई का उपयोग करते हैं, तो सी/सी ++ कोड जेएनआई-विशिष्ट हस्ताक्षरों का उपयोग करने के लिए लिखा जाना चाहिए।)

    एक और संभावना मालिकाना बाइनरी प्रोटोकॉल को कुछ प्रोग्रामिंग भाषाओं के साथ "बस काम करता है" के साथ प्रतिस्थापित करना है। यह समस्या की तरह है जहां कॉर्बा और इसी तरह की तकनीकें एक अच्छा समाधान प्रदान करती हैं।

    2

    यदि आपको जावा वर्चुअल मशीन पर चलने वाली कुछ चीज़ की आवश्यकता है लेकिन सी # की तरह बहुत कुछ दिखता है, तो आपको Stab देखें। यह पी/आह्वान और तरह के साथ मदद नहीं करेगा लेकिन आप इसे जावा के लिए बंदरगाह अपने सी # कोड के लिए कम काम खोजने के लिए और इसे बनाए रखने कर सकते हैं।

    आपको Mono में देखना चाहिए। मैं उम्मीद करता हूं कि आपका सी # कोड असम्बद्ध हो जाएगा (अप्रबंधित डीएलएल को छूने वाले हिस्सों को छोड़कर)।

    मैंने इसका उपयोग नहीं किया है लेकिन jni4net जावा से .NET कोड को कॉल करने की अनुमति देना है। यदि आपके ग्राहक जावा इंटरफेस चाहते हैं, तो यह एक समाधान हो सकता है।

    मैं लिनक्स और मैक पर मोनो का उपयोग करता हूं, भले ही .NET संगतता प्राथमिकता नहीं है। मुझे सी # और .NET पुस्तकालय पसंद हैं और सीएलआर को जेवीएम में पसंद करते हैं। मोनो एमआईटी/एक्स 11 लाइसेंस प्राप्त है जिसका मतलब है कि यदि आप चाहें तो आप इसे वाणिज्यिक रूप से उपयोग कर सकते हैं। कुछ अन्य लोगों के विपरीत, मुझे ओरेकल और आईबीएम द्वारा प्रौद्योगिकी चैंपियनिंग के पक्ष में माइक्रोसॉफ्ट द्वारा चैंपियन प्रौद्योगिकी से बचने का कोई कारण नहीं दिखता है।

    मोनो का उपयोग करके अप्रबंधित बिट्स के साथ आपकी सहायता नहीं होगी, हालांकि आप अभी भी मूल डीएलएल में पी/इनवोक कर सकते हैं। आपको बस उस डीएलएल को पोर्ट करना होगा या कुछ समकक्ष मिलना होगा।

    आप मोनो Ahead of Time compilation में भी देखना चाहते हैं।

    1

    यदि आप वास्तव में चाहते हैं, तो वास्तव में चाहते हैं कि .NET में कोड करने में सक्षम हो और इसे JVM पर चलाया जाए, तो आप check out Grasshopper (2015-09: संभावित रूप से मृत लिंक) कर सकते हैं। यही वह है जो इसे करने के लिए डिज़ाइन किया गया है।

    मुझे पता है कि मेन्सॉफ्ट लोग पिछले कुछ वर्षों में Mono में योगदानकर्ता रहे हैं। अगर मुझे सही याद है, तो उन्होंने मोनो के लिए विजुअल बेसिक कंपाइलर लिखा था।

    वहाँ भी C# to Java converter from Tangible है। मैंने अच्छी चीजें सुनी हैं लेकिन मैंने इसे कभी भी इस्तेमाल नहीं किया है।

    इसके अलावा, यह आपकी स्थिति में बहुत मदद नहीं करता है लेकिन मुझे Mono for Android इंगित करना चाहिए।

    एंड्रॉइड के लिए मोनो सीएलआर और Dalvik VM समानांतर में चलाता है। दूसरे शब्दों में, सी # कोड आप Android के लिए लिखा था जावा लाइब्रेरीज (उदाहरण के लिए एंड्रॉयड यूआई की तरह) में बुला जा सकता है और एक ही ऐप्लिकेशन के रूप में क्रियान्वित। आपने उसी प्रक्रिया में .NET और जावा कोड चलाने की क्षमता के बारे में पूछा था।जाहिर है, यह किया जा सकता है।

    संबंधित मुद्दे