2009-12-10 5 views
7

यह उन चीजों में से एक है जो इतना आसान है कि कोई भी कभी बाहर नहीं आता है और मैंने पढ़े गए किसी भी ट्यूटोरियल में यह कहता है।क्या विजुअल स्टूडियो में .NET परियोजनाएं हमेशा एक फ़ाइल में संकलित होती हैं?

मैं अकेले कुछ स्टैंड बना रहा हूं .NET अनुप्रयोगों के साथ-साथ अन्य प्रोग्रामों के लिए कुछ डीएलएल आधारित प्लग-इन। मैंने देखा है कि विजुअल स्टूडियो में एक परियोजना, कम से कम विंडोज अनुप्रयोगों और कक्षा पुस्तकालयों के साथ, एक फ़ाइल (EXE या DLL) में संकलित करें।

क्या यह हमेशा ऐसा होता है? एक बड़े आवेदन के आयोजन के मामले में क्या मुझे हमेशा अंतिम कार्यक्रम में एक फ़ाइल के अनुरूप विजुअल स्टूडियो में परियोजनाओं के बारे में सोचना चाहिए?

उत्तर

3

प्रत्येक परियोजना एक एकल फाइल को संकलित करता है। (वेब साइट परियोजनाओं के अलावा)

हालांकि, अगर आप प्रोजेक्ट में किसी भी फ़ाइल के लिए बिल्ड एक्शन को हमेशा कॉपी या कॉपी करने के लिए सेट करते हैं, तो प्रोजेक्ट उस फ़ाइल को आउटपुट फ़ोल्डर में कॉपी करेगा।
इसके अलावा, यदि किसी EXE प्रोजेक्ट में App.config फ़ाइल है, तो उसे आउटपुट फ़ोल्डर में भी कॉपी किया जाएगा।

यदि आपकी परियोजना एक डीएलएल (चाहे आपका स्वयं या कोई और है) का संदर्भ देता है जो कोर फ्रेमवर्क का हिस्सा नहीं है, तो वह उस डीएलएल को परियोजना के आउटपुट फ़ोल्डर में कॉपी करेगा, जिसके परिणामस्वरूप दो फाइलें होंगी (हालांकि उनमें से केवल एक ही होगी प्रोजेक्ट से कोड को ही शामिल करें)

इसके अलावा, डीएलएल और EXE के अलावा, विजुअल स्टूडियो एक .pdb फ़ाइल भी बनायेगा जिसमें आउटपुट फ़ोल्डर में डीबग प्रतीक होंगे। यह फ़ाइल डीबगर द्वारा उपयोग की जाती है और इसे आपके उपयोगकर्ताओं को वितरित नहीं किया जाना चाहिए। (जब तक कि आप उन्हें अपने कोड को डीबग नहीं करना चाहते)

1

विजुअल स्टूडियो के लिए, हाँ। "Netmodule" के लिए इंटरनेट पर खोजें और आपको वह दस्तावेज मिलेगा जिसे आप ढूंढ रहे हैं। मैं आज उनसे मिलने आया क्योंकि हम एक ही डीएलएल में कई परियोजनाओं को इकट्ठा करना चाहते थे।

MSDN: http://msdn.microsoft.com/en-us/library/226t7yxe(VS.80).aspx

+0

नेटमोड्यूल विपरीत हैं। मैं भी उनके द्वारा मूर्ख था। Netmodules आपको असेंबली को कई फाइलों में विभाजित करने की अनुमति देता है (उदाहरण के लिए उन्हें अलग से लोड करने की अनुमति देने के लिए)। वे सामान्य संदर्भित डीएलएस के समान हैं। चूंकि आपके लिंक में नेटमोड्यूल आपको "मल्टीफाइल असेंबली" बनाने की अनुमति देता है। –

1

आवश्यक नहीं है। यदि आपके प्रोजेक्ट में संस्कृति उन्मुख संसाधन हैं, तो वे आम तौर पर अलग असेंबली (डीएलएस) में संकलित होते हैं। एएसपी.Net परियोजनाओं को एक असेंबली में संकलित नहीं किया जाता है, आपके पास हमेशा आपकी एएसपीएक्स/एसीएक्स फाइलें होंगी या उनके मार्कर समकक्ष संकलित कोड से अलग रहेंगे।

+2

_ वेब साइट प्रोजेक्ट्स_ एक असेंबली में संकलित नहीं होते हैं - वे बिल्कुल संकलित नहीं होते हैं। _ वेब अनुप्रयोग प्रोजेक्ट_ _do_ एक असेंबली में संकलित हो जाओ। –

+0

अच्छा बिंदु - मैं जो वेब सामग्री करता हूं वह एक वेब ऐप प्रोजेक्ट है, इसलिए मैं अंतर का उल्लेख करने के बारे में सब भूल गया :) – slugster

+2

यदि आप वेब परिनियोजन परियोजनाओं का उपयोग करते हैं, तो भी आप उन्हें एक असेंबली में संकलित कर सकते हैं। Aspnet_merge.exe जादू करता है। –

2

अपनी सरल परियोजनाओं के लिए, हाँ, आपको हमेशा प्रति परियोजना एक असेंबली मिल जाएगी। हालांकि, अगर आप अधिक उत्पादन तैयार सॉफ्टवेयर की ओर बढ़ते हैं तो उत्तर अलग होता है। मान लीजिए कि आप एक डीएलएल वितरित करना चाहते हैं, लेकिन इसमें टेक्स्ट शामिल है जिसे उपयोगकर्ता को प्रदर्शित किया जाना चाहिए। आप शायद उस पाठ को स्थानीयकृत करना चाहते हैं (अंग्रेजी और जर्मन संस्करण या यहां तक ​​कि यूएस-अंग्रेज़ी और ग्रेट ब्रिटेन-अंग्रेज़ी [सोच कार्यक्रम बनाम कार्यक्रम] प्रदान करें)। आप अपने पाठ को संसाधनों में रखेंगे और फिर उन संसाधनों को संकलित करेंगे जिन्हें सैटेलाइट असेंबली कहा जाता है। आप प्रत्येक लोकेल के लिए एक सैटेलाइट असेंबली प्राप्त करेंगे जिसे आप समर्थन देना चुनते हैं। http://sanjaysainitech.blogspot.com/2007/08/satellite-assemblies.html

मैं लोगों netmodules और ILMerge बारे में बात कर देखें:

यहाँ कैसे पैदा करते हैं और उपग्रह विधानसभाओं का उपयोग करने पर नीचे एक शीघ्र। मुझे लगता है कि अगर आप netmodules के बारे में चिंतित हैं तो आप कुछ गलत कर रहे हैं क्योंकि आप माइक्रोसॉफ्ट ने आपको दिए गए टूल्स का उपयोग नहीं कर रहे हैं (या आप मोनो भूमि में हैं, इस मामले में आप माइक्रोसॉफ्ट से कोई उपकरण नहीं हैं)। मैंने ILMerge का उपयोग नहीं किया है, लेकिन इसके बारे में पढ़ने के बाद मुझे यकीन नहीं है कि मुझे विश्वास है। This person का कहना है कि यह WPF/XAML कोड को छोड़कर ठीक काम करता है; this person को आईएलएमर्ज चलाने के बाद एम्बेडेड संसाधनों तक पहुंचने में परेशानी थी; this person ने अनुकूलित कोड देखा जो ILMerge चलाने के बाद डीबगर का उपयोग करने के दौरान कदम नहीं उठाया जा सका।मुझे यह बताने के लिए पर्याप्त जानकारी है कि ILMerge सभी परिदृश्यों के लिए एक उत्पादन तैयार उपकरण नहीं है। डिज़ाइनिंग सॉफ़्टवेयर का एक हिस्सा यह पता लगा रहा है कि आप इसे कैसे तैनात करेंगे। यदि आप असेंबली की एक छोटी संख्या को तैनात करना चाहते हैं, तो आपको इसे संकलित करने के बाद आईएल में उलझाने के बजाय अपने सॉफ़्टवेयर को इस तरह डिज़ाइन करना चाहिए। जैसा कि कार्टोग्राफर कहते थे, "यहां ड्रैगन हो।"

2

उदाहरण एक भी dll में कई मॉड्यूल और लिंक विषय बनाने का तरीका:

csc /t:module RarelyUsedTypes.cs 
csc /out:AllTypes.dll /t:library /addmodule:RarelyUsedTypes.netmodule AllTypes.cs 

अधिक जानकारी के लिए रिक्टर की पुस्तक CLR via C# देखते हैं।

आप विजुअल स्टूडियो के लिए इस प्रक्रिया को स्वचालित कर सकते हैं।

आपकी प्रत्येक परियोजना के लिए नेटमॉड्यूल या असेंबली बनाएं और उन्हें एक ही असेंबली में संकलित करें।

पहला विकल्प। यह Jay R. Wren द्वारा प्रस्तावित किया गया:

यह एक प्यारा हैक है, लेकिन सीएससी और वीबीसी के साथ दोनों /target:module और /addmodule विकल्प का समर्थन करते हुए आप वास्तव में इस ILMerge बिना सिर्फ एक खोल स्क्रिप्ट का उपयोग करके कर सकता है या फ़ाइल बनाओ।

विजुअल स्टूडियो "netmodule" प्रकार का समर्थन नहीं करता है, लेकिन एमएसबिल्ड करता है।

अपने समाधान में वीबी परियोजना जोड़ें। प्रोजेक्ट को अनलोड करें और प्रोजेक्ट फ़ाइल को संपादित करें।

OutputType बदलें मॉड्यूल:

<OutputType>module</OutputType> 

इसके बजाय वांछित परियोजना के लिए एक संदर्भ जोड़ने के लिए, हम एक मॉड्यूल जोड़ें। अफसोस की बात है, फिर से VStudio यहां विफल रहता है, लेकिन MSBUILD बस ठीक काम करता है। प्रोजेक्ट को अनलोड करें और प्रोजेक्ट फ़ाइल को संपादित करें। AddModules के साथ एक आइटम समूह जोड़ें निर्देश शामिल हैं।

<ItemGroup><AddModules Include="..\VbXml\bin\Debug\VbXml.netmodule" /></ItemGroup> 

इस MSBuild बता सिर्फ संदर्भ आइटम समूह जो स्टूडियो का प्रबंधन करता है /addmodule निर्देशों का उपयोग करने, सीएससी बताने के लिए होगा।

मेजर ड्राबैक: जोड़ा मॉड्यूल के लिए कोई विजुअल स्टूडियो इंटेलिजेंस नहीं। हमारे पास पहले से संदर्भ हैं, यह बहुत बुरा है कि हमारे पास मॉड्यूल नहीं हैं। [अद्यतन: जैसा कि @ आर्क-कुन ने बताया, विजुअल स्टूडियो .netmodule परियोजनाओं और इंटेलिजेंस का संदर्भ दे सकता है। आउटपुट प्रकार को बदलने से पहले बस परियोजना संदर्भ जोड़ें।]

शार्प डेवलपमेंट का पहला कदम है, लेकिन दूसरा चरण, "मॉड्यूल जोड़ें" gui एसडी 2.0 के बाद कम प्राथमिकता आइटम के रूप में खुला है।

दूसरा विकल्प। यह great article (स्कॉट हंसेलमैन द्वारा) वर्णन करता है कि यदि आप विजुअल स्टूडियो का उपयोग कर रहे हैं तो असेंबली को स्वचालित रूप से कैसे करें।यह आपको पहले वैकल्पिक के विपरीत IntelliSense समर्थन देता है।

+0

सभी तीन तरीकों से एक असेंबली उत्पन्न होती है। लेकिन केवल तीसरा तरीका आपको एक ** ** ** देता है। –

+0

क्या आप इस पर विस्तार कर सकते हैं: "AddModules के साथ एक आइटम समूह को निर्देश शामिल करें।" ' ... '''' .csproj' के टैग के तहत स्कीमा का उल्लंघन करता है। –

+0

@ आर्क-कुन: स्कीमा उल्लंघन एक समस्या नहीं होनी चाहिए। मैं उन्हें एक संकेत मानता हूं कि कुछ गलत हो सकता है (जब तक आपको * उल्लंघन नहीं करना चाहिए)। –

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