एक ही परियोजना में सी # और वीबी मिलाकर


145

क्या आप किसी क्लास लाइब्रेरी के लिए उसी प्रोजेक्ट में vb और c # फाइलें मिला सकते हैं? क्या कुछ सेटिंग है जो इसे संभव बनाती है?

मैंने कोशिश की और इंटेलीजेंस में से कोई भी सही काम नहीं करता है, हालांकि पृष्ठभूमि संकलक इसे काफी अच्छी तरह से संभालता है (इस तथ्य से अलग कि मैं, फिर, एक ही नाम के साथ एक ही नाम के 2 वर्ग थे और इसकी शिकायत नहीं थी)।

हम VB से C # में कनवर्ट करने का प्रयास कर रहे हैं, लेकिन सभी कोड को कनवर्ट करना समाप्त नहीं किया है । मेरे पास कुछ नए कोड हैं जिन्हें मुझे लिखने की आवश्यकता है, लेकिन वास्तव में इसके लिए एक नया प्रोजेक्ट नहीं बनाना चाहते हैं।


9
यदि आप C # में कनवर्ट करना समाप्त कर रहे हैं तो आप VB में नया कोड क्यों लिख रहे हैं?
एडम रॉबिन्सन

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

डांग, यह मेरा अगला प्रयास होने वाला था।
वेस P

1
मेरी पोस्ट फिक्स्ड। हम समाप्त नहीं हुए हैं।
वेस P

10
VB कोड को मिश्रित करने के कारणों में से एक इसकी अनूठी विशेषताओं का उपयोग करना है, विशेष रूप से इसकी XML क्षमताएं यदि आप उदाहरण के लिए LINQ से XML का उपयोग कर रहे हैं। इस तरह से 'मूल से तत्व में लिखने के बजाय। ("डेटा")' आप VB के डायनामिक XML सिंटैक्स का उपयोग कर सकते हैं: 'तत्व से रूट में। <डेटा>'। XML फ़ाइलों के साथ बहुत काम करते समय यह सिंटैक्स C # s के साथ काम करने में बहुत आसान हो सकता है
12:52

जवाबों:


128

नहीं, आप नहीं कर सकते। एक विधानसभा / परियोजना (प्रत्येक परियोजना आमतौर पर 1 विधानसभा के लिए संकलित होती है) को एक भाषा होना चाहिए। हालाँकि, आप कई विधानसभाओं का उपयोग कर सकते हैं, और प्रत्येक को एक अलग भाषा में कोडित किया जा सकता है क्योंकि वे सभी MSIL के लिए संकलित हैं।

इसने ठीक संकलित किया और शिकायत नहीं की क्योंकि VB.NET प्रोजेक्ट वास्तव में केवल .vb फाइलों को संकलित करेगा और C # प्रोजेक्ट केवल .cs फाइलों को संकलित करेगा। यह दूसरे की उपेक्षा कर रहा था, इसलिए आपको त्रुटियां नहीं मिलीं।

संपादित करें: यदि आप एक। #B फ़ाइल को C # प्रोजेक्ट में जोड़ते हैं, तो समाधान एक्सप्लोरर पैनल में फ़ाइल का चयन करें और फिर गुण पैनल देखें, आप देखेंगे कि बिल्ड एक्शन 'सामग्री' है, न कि 'संकलन'। यह एक साधारण पाठ फ़ाइल के रूप में माना जाता है और बाइनरी संसाधन के रूप में संकलित असेंबली में भी नहीं मिलता है।

संपादित करें: asp.net वेबसाइटों के साथ आप vb.net वेबसाइट पर c # वेब उपयोगकर्ता नियंत्रण जोड़ सकते हैं


1
इस तथ्य के बाद दो विधानसभाओं को संयोजित करने के तरीके हैं, लेकिन यह उपयोगकर्ता की समस्या को हल नहीं करेगा।
स्टीवन सुदित

यह सच है, लेकिन मैं भाषाओं के मिश्रण के एकमात्र उद्देश्य के लिए इसकी निंदा नहीं करूंगा।
जोएल बी शानदार

मेरा मानना ​​है कि आप एक ही प्रोजेक्ट में प्रबंधित और अप्रबंधित c ++ को मिला सकते हैं।
कैलम रोजर्स

@ सी रोजर्स: यह स्थिति पूरी तरह से एक अलग संकट है। यदि आप चाहें तो प्रबंधित और अप्रबंधित C ++ को उसी स्रोत फ़ाइल में मिला सकते हैं। लेकिन यह अभी भी VB.NET और C # को मिलाने जैसा नहीं है।
जोएल बी शानदार

3
@ डनहौर्ड: आउच, बर्न। यह निश्चित रूप से एक ब्लॉक है, जो एक ही प्रोजेक्ट के भीतर भाषाओं को मिलाने और मिलान करने में सक्षम नहीं है!

32

खैर, वास्तव में मुझे कुछ साल पहले एक सहकर्मी से विरासत में एक परियोजना मिली थी, जिसने उसी परियोजना के भीतर वीबी और सी # वेबफॉर्म को मिलाने का फैसला किया था। यह काम किया लेकिन बनाए रखने के लिए मज़ेदार है।

मैंने तय किया कि नया कोड C # कक्षाएं होना चाहिए और उन्हें काम पर लाने के लिए मुझे web.config के संकलन भाग में एक सबनोड जोड़ना होगा।

        <codeSubDirectories>
            <add directoryName="VB"/>
            <add directoryName="CS"/>
        </codeSubDirectories>

सभी VB कोड CSB में V_ और C # कोड नामक App_Code में एक सबफ़ोल्डर में जाता है। यह दो .dll फ़ाइलों का उत्पादन करेगा। यह काम करता है, लेकिन कोड को उसी क्रम में संकलित किया जाता है जैसा कि "codeSubDirectories" में सूचीबद्ध है और इसलिए C # और VB दोनों में उपयोग किए जाने पर इंटरफेस वीबी फ़ोल्डर में होना चाहिए।

मेरे पास VB और C # कंपाइलर दोनों का संदर्भ है

<system.codedom>
    <compilers>

परियोजना को वर्तमान में 3.5 के लिए अद्यतन किया गया है और यह अभी भी काम करता है (लेकिन अभी भी इसे बनाए रखने के लिए कोई मज़ा नहीं है ..)


अधिक जानकारी के लिए stackoverflow.com/questions/15711964/… देखें
जॉन

20

आप vb और c # को एक ही प्रोजेक्ट के भीतर नहीं मिला सकते हैं - यदि आप दृश्य स्टूडियो में नोटिस करते हैं तो प्रोजेक्ट फाइलें या तो .vproj या .csproj हैं। आप एक समाधान के भीतर कर सकते हैं - vb में 1 proj और c # में 1 है।

ऐसा लगता है कि इस के अनुसार आप संभावित रूप से App_Code निर्देशिका में एक वेब परियोजना में उन दोनों का उपयोग कर सकते हैं:

http://pietschsoft.com/post/2006/03/30/ASPNET-20-Use-VBNET-and-C-within-the-App_Code-folder.aspx


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

8
वोट दें। उपयोगकर्ताओं के दृष्टिकोण से यह विचार अलग है कि विस्तार अलग-अलग है।
user4951

14

यह कुछ कस्टम MSBuild विकास के साथ संभव हो सकता है। आपूर्ति की गई .targets परियोजनाओं को एकल भाषा होने के लिए मजबूर करती है - लेकिन इसे रोकने वाला कोई रनटाइम या टूलिंग प्रतिबंध नहीं है।

VB और CS दोनों कंपाइलर मॉड्यूल्स में आउटपुट कर सकते हैं - CLR का .obj फ़ाइलों का संस्करण। असेंबली लिंकर का उपयोग करके, आप VB और CS कोड से मॉड्यूल ले सकते हैं और एक असेंबली का उत्पादन कर सकते हैं।

ऐसा नहीं है कि यह एक कठिन प्रयास होगा, लेकिन यह शायद काम करेगा।


6
थॉमस फ्रायडेनबर्ग द्वारा यहाँ पर इस पर एक अच्छा लेखन हुआ है
डेव एम

1
इसका एक और उदाहरण नमूना में पाया जा सकता है : जुन्फेन्ग झांग के द्वारा अप्रबंधित C ++, C ++ / CLI और C # कोड को मिलाना। यह पहली बार चलने के बाद इसे काम कर सकता है। मेरे विजुअल स्टूडियो इंस्टॉलेशन से \ VC \ bin \ vcvars32.bat। यह वास्तव में विभिन्न भाषाओं का मिश्रण है एक परियोजना के बजाय एक विधानसभा है।
आर। श्रेयर्स

7

वॉकथ्रू: एक वेब साइट परियोजना में कई प्रोग्रामिंग भाषाओं का उपयोग करना http://msdn.microsoft.com/en-us/library/ms366714.aspx

डिफ़ॉल्ट रूप से, App_Code फ़ोल्डर कई प्रोग्रामिंग भाषाओं की अनुमति नहीं देता है। हालाँकि, एक वेब साइट परियोजना में आप अपने बेसिक बेसिक और C # जैसे कई प्रोग्रामिंग लैंग्वेज को सपोर्ट करने के लिए अपने फोल्डर स्ट्रक्चर और कॉन्फ़िगरेशन सेटिंग्स को संशोधित कर सकते हैं । यह ASP.NET को एक से अधिक असेंबली, प्रत्येक भाषा के लिए एक बनाने की अनुमति देता है। अधिक जानकारी के लिए, ASP.NET वेब प्रोजेक्ट्स में साझा कोड फ़ोल्डर देखें। डेवलपर्स आमतौर पर कई विकास टीमों का समर्थन करने के लिए वेब अनुप्रयोगों में कई प्रोग्रामिंग भाषाओं को शामिल करते हैं जो स्वतंत्र रूप से काम करते हैं और विभिन्न प्रोग्रामिंग भाषाओं को पसंद करते हैं।


2

हालाँकि Visual Studio इसका समर्थन नहीं करता है (आप कुछ ट्रिक्स कर सकते हैं और MSBuild को दोनों को संकलित करने के लिए प्राप्त कर सकते हैं, लेकिन Visual Studio के भीतर से नहीं), SharpDevelop करता है। आप दोनों एक ही समाधान में हो सकते हैं (जब तक आप विजुअल स्टूडियो प्रोफेशनल और उससे ऊपर चल रहे हैं), इसलिए सबसे आसान समाधान यदि आप विज़ुअल स्टूडियो का उपयोग करना चाहते हैं तो अपने वीबी कोड को एक अलग प्रोजेक्ट में अलग करना है और इसे इस तरह एक्सेस करना है।


1
ShartDevelop इसका समर्थन कैसे करता है? मैंने बस कोशिश की और यह संकलन नहीं है। क्या ऐसा कुछ विशेष है जिसे करने की आवश्यकता है?
20

2

प्रोजेक्ट को राइट-क्लिक करें। Asp.Net फ़ोल्डर जोड़ें चुनें। फ़ोल्डर के तहत, दो फ़ोल्डर बनाएँ एक नाम VBCodeFiles और अन्य CSCodeFiles In Web.Config संकलन के तहत एक नया तत्व जोड़ें

<compilation debug="true" targetFramework="4.5.1">
      <codeSubDirectories>
        <add directoryName="VBCodeFiles"/>
        <add directoryName="CSCodeFiles"/>
      </codeSubDirectories>
</compilation>

अब, एक cshtml पेज बनाएँ। VBCodeFiles.Namespace.MyClassName का उपयोग करके एक संदर्भ जोड़ें

@using DMH.VBCodeFiles.Utils.RCMHD
@model MyClassname

जहाँ MyClassName एक क्लास ऑब्जेक्ट है जो ऊपर दिए गए नामस्थान में पाया जाता है। अब एक cshtml फ़ाइल का उपयोग करके रेजर में ऑब्जेक्ट को लिखें।

<p>@Model.FirstName</p>

कृपया ध्यान दें, यदि यह C # प्रोजेक्ट है और DirectoryName = "CSCodeFiles" अनावश्यक है, तो यदि यह VB.Net प्रोजेक्ट है तो C # प्रोजेक्ट और डायरेक्टरीनेम = "VBCodeFiles" बेमानी है।


2

हाँ इसका संभव है। एक समाधान में c # और vb.net परियोजनाओं को जोड़ना।

चरण 1: फ़ाइल-> जोड़ें-> मौजूदा परियोजना

Step2: प्रोजेक्ट-> संदर्भ जोड़ें-> dll या exe प्रोजेक्ट का जो आपने पहले जोड़ा था।

step3: vb.net फॉर्म में, जहाँ u c # फॉर्म्स-> प्रोजेक्ट के नाम आयात करना चाहते हैं।


1

मैं यह नहीं देखता कि आप किसी प्रोजेक्ट को C # कंपाइलर (या VB कंपाइलर) के साथ कैसे संकलित कर सकते हैं और न ही इसे कंपाइलर के लिए गलत भाषा में गंजा किया है।

अपने VB प्रोजेक्ट से एक अलग प्रोजेक्ट में अपना C # कोड रखें। आप इन परियोजनाओं को एक ही समाधान में शामिल कर सकते हैं।


1

आपको प्रति भाषा एक परियोजना की आवश्यकता है। मुझे पूरा विश्वास है कि मैंने एक उपकरण देखा जो असेंबली को मर्ज कर देता है, अगर आपको वह उपकरण मिल जाए तो आपको जाने के लिए अच्छा होना चाहिए। यदि आपको एक ही कक्षा में दोनों भाषाओं का उपयोग करने की आवश्यकता है, तो आपको VB.net कहने के लिए इसका आधा भाग लिखने में सक्षम होना चाहिए और फिर VB.net वर्ग को विरासत में देकर C # में बाकी लिख देना चाहिए।


1

हर दूसरे जवाब को प्रतिध्वनित करने के जोखिम पर, नहीं, आप उन्हें एक ही परियोजना में नहीं मिला सकते।

एक तरफ, यदि आपने VB को C # में परिवर्तित करना समाप्त कर दिया है, तो आप VB में नया कोड क्यों लिखेंगे?


2
क्योंकि आपको मेरी पोस्ट में एक त्रुटि मिली :) हमने अभी तक कनवर्ज़न पूरा नहीं किया है।
वेस P

1

.Net 2.0 के लिए यह काम करता है। यदि आप संबंधित भाषा कोड के साथ ऐप कोड में उप निर्देशिका बनाते हैं तो यह एक ही परियोजना में दोनों को संकलित करता है। हालांकि, मैं देख रहा हूं कि यह 3.5 में काम करना चाहिए या नहीं।


1

आप अपने VBकोड को लाइब्रेरी में क्यों नहीं संकलित करते हैं ( .dll)। अपने कोड से इसे बाद में देखें और यही है। प्रबंधित dllsशामिल MSILकरने के लिए जो दोनों c#और vbसंकलित कर रहे हैं।


2
यदि आपको कभी भी अपने नए C # कोड को विरासत VB.NET कोड से संदर्भित करने की आवश्यकता है, तो आप पूरी तरह से भर जाएंगे। या इसके विपरीत, जो भी आप जाते हैं, वह केवल एक तरफ़ा संदर्भ है।
रोमन स्टार्कोव

0

जैसा कि दूसरों ने कहा है, आप दोनों को एक परियोजना में नहीं रख सकते। हालाँकि, यदि आपके पास C # या VB कोड का एक छोटा सा टुकड़ा है जिसे आप दूसरी भाषा में किसी प्रोजेक्ट में शामिल करना चाहते हैं, तो स्वचालित रूपांतरण उपकरण हैं । वे सही नहीं हैं, लेकिन वे ज्यादातर चीजें बहुत अच्छी करते हैं। इसके अलावा, SharpDevelop में निर्मित रूपांतरण उपयोगिता है।


वहाँ है कि मैं इसे सिर्फ चूस सकता था और वीबी में मुझे जो चाहिए उसे कोड करता था और बाद में बाकी सामान के साथ बदल देता था।
वेस P

0

नहीं, एक ही परियोजना में नहीं। लेकिन आप उन्हें एक ही समाधान में उपयोग कर सकते हैं। हालाँकि आपको यह ध्यान रखने की आवश्यकता है कि आपका कोड सीएलएस अनुपालन है। इसका मतलब है कि आपने ऐसी कार्यक्षमता / सुविधा का उपयोग नहीं किया होगा जो अन्य भाषा द्वारा समझ में नहीं आती है। उदाहरण के लिए VB अहस्ताक्षरित ints को नहीं समझता है।


0

हमारे परिदृश्य में, एक एकल समाधान में इसका एक VB.NET प्रोजेक्ट (विंडोज डेस्कटॉप एप्लिकेशन)। हालाँकि हम VB.NET में हस्ताक्षरित / अहस्ताक्षरित पूर्णांक और XML शाब्दिक और स्ट्रिंग सुविधाओं जैसी C # सुविधाओं का लाभ उठाना चाहते थे। इसलिए सुविधाओं के आधार पर, रनटाइम पर हम कोड फ़ाइल का निर्माण करते हैं, संबंधित Rosalyn संकलक (VB / CS) का उपयोग करके DLL में और गतिशील रूप से वर्तमान असेंबली में लोड करते हैं। बेशक हमें डायनेमिक डीएलएल के डेलिंकिंग, अनलोडिंग, रीलोडिंग, नामकरण आदि पर काम करना था और स्मृति प्रबंधन थे कि हम संघर्ष से बचने के लिए बड़े पैमाने पर डायनामिक GUID का उपयोग कर रहे थे। यह ठीक काम करता है जहां ऐप उपयोगकर्ता हमारे डेस्कटॉप ऐप से किसी भी डीबी से जुड़ सकता है, SQL क्वेरी लिख सकता है, कनेक्शन को LINQ कनेक्शन में बदल सकता है और LINQ क्वेरी भी लिख सकता है, जिसके लिए सभी को स्रोत कोड के गतिशील भवन की आवश्यकता होती है, जो DLL में संकलित करता है और वर्तमान असेंबली में संलग्न होता है।


-1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.