2009-11-22 7 views
19

में कनवर्ट करना एक प्रोग्राम है जो पूरी तरह से सी # में लिखा गया है जो .NET Framework 2.0 को लक्षित करता है। क्या कोई तरीका है कि मैं किसी भी तरह संकलित (अनुवाद) प्रबंधित कर सकता हूं EXE को मूल में तो यह .NET-अज्ञेयवादी हो सकता है? मुझे पता है कि उस उद्देश्य के लिए शायद वाणिज्यिक उत्पाद हैं ... लेकिन वे थोड़ा महंगा हैं।.NET ऐप को x86 देशी कोड

समस्या यह है कि हम Windows XP चलाने वाले कंप्यूटरों पर प्रोग्राम को तैनात करना चाहते हैं, जिसमें .NET Framework स्थापित नहीं है। एक आवश्यकता भी है कि प्रोग्राम का आकार 500 केबी (1 एमबी अधिकतम) से अधिक नहीं होना चाहिए क्योंकि इसे वेब सर्वर से डाउनलोड किया गया है (अब आकार 255 केबी है)। यही कारण है कि हम किसी भी तरह से डाउनलोड किए गए प्रोग्राम की फ़ाइल में एक पूर्ण .NET FX (या यहां तक ​​कि एक कम) संलग्न नहीं कर सकते हैं।

स्पष्ट रूप से यह एक भयानक सॉफ़्टवेयर इंजीनियरिंग त्रुटि है जिसे पता चला और पहले से बचा जाना चाहिए ताकि हम इसके बजाय सी ++ जैसी मूल तकनीकों का उपयोग कर सकें।

हमने अब नोवेल के मोनो - लिनक्स, मैक और विंडोज के लिए .NET Framework का एक ओपन-सोर्स कार्यान्वयन करने का प्रयास किया है। मोनो में सी # कंपाइलर, आईडीई, रनटाइम (सीएलआर) और क्लास लाइब्रेरी असेंबली शामिल हैं (जैसे System.dll और mscorlib.dll - जीएसी में स्थापित .NET की क्लास लाइब्रेरी असेंबली की तरह)। हमने सीएलआर फाइलों का पता लगाने और हमारे कार्यक्रम की फाइल और कुछ असेंबली के साथ उनको शिप करने का प्रयास किया है। इस तरह प्रोग्राम को उपयोगकर्ता के कंप्यूटर पर "mono program.exe" (कमांड प्रॉम्प्ट) चलाकर बुलाया जा सकता है। अंतिम उपयोगकर्ता सीएलआर फ़ाइलों (mono.exe और mono.dll) के लिए इस तरह के उपयोग की असुविधा के अलावा कुल मिलाकर 2.5 एमबी हो गया जो वांछित 500 Kb या यहां तक ​​कि 1 एमबी से भी अधिक है।

तो, हम कोई विकल्प नहीं एक संकलक द्वारा एक देशी एक के लिए हमारी नेट अनुप्रयोग का अनुवाद करने के साथ छोड़ दिया है, लेकिन सवाल बनी हुई है - क्या संकलक हम का उपयोग करना चाहिए और जहां हम एक मिल सकता है ...

अब के लिए मैंने माइक्रोसॉफ्ट रिसर्च द्वारा सिंगुल्युलर ओएस प्रोजेक्ट पर ठोकर खाई है। यह एक ओपन-सोर्स रिसर्च ओएस है जो प्रबंधित कोड (कम से कम भाग में) में लिखा गया है। सिंगुल्युलिटी ओएस में एक बार्टोक कंपाइलर शामिल है जिसे ओएस एक प्रबंधित प्रोग्राम को मूल (x86 32 बिट) में अनुवाद करने के लिए उपयोग करता है। यह ध्यान दिया जाना चाहिए कि Bartok .NET 2.0 के सभी पहलुओं को देशी कोड में अनुवाद नहीं कर सकता है, लेकिन उनमें से अधिकांश। हालांकि मैंने अभी तक एकवचनता का उपयोग नहीं किया है ...

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

अग्रिम में बहुत बहुत धन्यवाद!

अंत में, मोनो की पूर्ण एओटी सुविधा (कॉलम रोजर्स की सलाह पर) का उपयोग करके मैंने एक प्रोग्राम.exe.dll उत्पन्न करने में कामयाब रहा है जिसमें सीएलआई हेडर की कमी है। तो यह मुझे देशी डीएल की तरह दिखता है। हालांकि मैं यह नहीं समझ सकता कि उस डीएल को एक्सई में कैसे परिवर्तित करें या इसे परिचालित करें। इसके अलावा यह डीएल मुख्य कार्य जैसे ब्याज के किसी भी कार्य को बेनकाब नहीं करता है।

+3

लेस शिकार: http://stackoverflow.com/questions/45702/is-there-some-way-to-compile-a-net-application-to-native- कोड –

+0

क्या आप इस क्रॉस प्लेटफॉर्म को बनाने की कोशिश कर रहे हैं, या फ्रेमवर्क पुस्तकालयों पर निर्भरता को हटा दें? –

+0

मैं सिर्फ .NET Framework की निर्भरताओं को हटाने की कोशिश कर रहा हूं, इसलिए इसे Windows XP w/o .NET FX पर चलाया जा सकता है। – Vlad

उत्तर

1

नहीं वास्तव में देशी रूपांतरण के लिए नेट के लिए एक समाधान है, लेकिन हो सकता है इस में मदद करता है: ज्यादा के अलावा बड़ी मेहनत से आवेदन को फिर से लिखने आप कर सकते है http://www.yoda.arachsys.com/csharp/faq/#framework.required

+0

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

+0

लिंक मृत प्रतीत होता है। –

0

नहीं काफी यकीन है कि वहाँ। पहले से ही बोझ प्रक्रिया को कम करने के लिए, आप रिफ्लेक्टर (माइक्रोसॉफ्ट सी ++ में) जैसे किसी भी चीज का उपयोग करके .NET एप्लिकेशन को अलग कर सकते हैं, और मूल आधार के साथ प्रबंधित सी ++ संदर्भों को शुरू करने के लिए आधार के रूप में उपयोग कर सकते हैं।

+1

मुझे उम्मीद है कि पूरे ऐप को सी ++ में फिर से लिखने से बचने का एक तरीका मिलेगा क्योंकि इसमें काफी समय लगेगा और सबसे महत्वपूर्ण समय पर डिबगिंग समय लगेगा। – Vlad

9

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

इसके बारे में at the mono-project.com website और at Miguel de Icaza's blog (और iPhone info) पढ़ें।

ध्यान दें कि आप की तरह

interface IFoo<T> { 
... 
    void SomeMethod(); 
} 

गतिशील कोड या जेनेरिक इंटरफेस का उपयोग नहीं कर सकते हैं और अगर आप सभी पुस्तकालयों आपके द्वारा उपयोग की DLLs संकलित करने के लिए होगा।

पीएस: अपनी समस्या के लिए "पूर्ण" एओटी का उपयोग करना सुनिश्चित करें।

+0

आपके उत्तर के लिए धन्यवाद। ऐसा लगता है कि मैंने पहले इस तरह एक नमूना हैलो वर्ल्ड असेंबली संकलित करने की कोशिश की है, लेकिन यह असफल रहा। संभवतः क्योंकि यह [मोनो का पूर्ण एओटी] प्रत्येक प्रोसेसर के साथ संगत नहीं है (मुझे इंटेल कोर 2 डुओ मिला है)। हालांकि, मैं पूरी तरह से पूर्ण एओटी की जांच करूँगा क्योंकि संभावना है कि मैंने कुछ गलत किया है – Vlad

+0

पूर्ण एओटी कम से कम x86 और x86-64 के साथ-साथ एआरएम और पीपीसी प्रोसेसर के लिए काम करता है। – Gonzalo

+0

अंत में मैंने एक प्रोग्राम.exe.dll उत्पन्न करने में कामयाब रहा है जिसमें सीएलआई हेडर की कमी है। तो यह एक देशी डीएल की तरह दिखता है। हालांकि मैं यह नहीं समझ सकता कि उस डीएल को एक्सई में कैसे परिवर्तित करें या इसे परिचालित करें। इसके अलावा यह डीएल मुख्य फंक्शन – Vlad

3

CrossNet नामक एक प्रोजेक्ट है जो नेट असेंबली पार्स करता है और अप्रबंधित सी ++ कोड उत्पन्न करता है, जिसे किसी भी मानक कंपाइलर में संकलित किया जा सकता है।

+0

क्या यह असेंबली या कोड पार्स करता है? पूछने के लिए खेद है लेकिन परियोजना मुझे भ्रमित लगती है। –

8

2017 अद्यतन

@jenix's comment के रूप में, .नेट मूल निवासी केवल Windows स्टोर ऐप्स (UWP) के लिए है। इसकी घोषणा के 3 साल बाद, यह अभी भी सच है, डेस्कटॉप के लिए मूल नेटनेट माइक्रोसॉफ्ट द्वारा छोड़ा जा सकता है। तो यह जवाब अब लागू नहीं है।

कंसोल ऐप्स के लिए, आप .NET कोर Self-contained deployments (SCD) का उपयोग कर सकते हैं। एक हैलो वर्ल्ड ऐप के लिए भी, आपका पैकेज 50 एमबी + होगा। आपको अभी भी वीसी रनटाइम स्थापित करने की आवश्यकता है।

========

माइक्रोसॉफ्ट बिल्ड 2014

पर नेट मूल निवासी पूर्वावलोकन की घोषणा की नेट मूल निवासी डेवलपर पूर्वावलोकन के साथ, ऐप्स पूरी तरह से के रूप में अंत उपयोगकर्ता उपकरणों पर तैनात हो जाएगी स्वयं निहित मूल रूप से संकलित कोड, और लक्ष्य डिवाइस/मशीन पर .NET Framework पर निर्भरता नहीं होगी। इसलिए, .NET मूल के साथ लक्ष्य मशीन पर कोई .NET ढांचा आवश्यक नहीं है।

Announcing .NET Native Preview
Microsoft .NET Native

+3

.NET मूल केवल विंडोज स्टोर ऐप्स के लिए है .. – Jenix

+0

@ जेनिक्सग्यू हां, 2 साल बाद। – prime23