आप विजुअल स्टूडियो में प्रोजेक्ट / समाधान के बीच कोड कैसे साझा करते हैं?


229

मेरे पास दो समाधान हैं जिनमें कुछ सामान्य कोड हैं, इसलिए मैं इसे बाहर निकालना और उनके बीच साझा करना चाहूंगा। इसके अलावा, मैं उस लाइब्रेरी को स्वतंत्र रूप से जारी करने में सक्षम होना चाहता हूं क्योंकि यह दूसरों के लिए उपयोगी हो सकता है।

  • विजुअल स्टूडियो 2008 के साथ इसे करने का सबसे अच्छा तरीका क्या है?
  • क्या एक परियोजना एक से अधिक समाधानों में मौजूद है?
  • क्या मेरे पास कोड के अलग टुकड़े के लिए एक अलग समाधान है?
  • क्या एक समाधान दूसरे पर निर्भर हो सकता है?

15
इसका 2014. नुगेट इसका जवाब है।
रवि

1
@ रवि मैं अपने कार्यालय में विकसित एक विजुअल स्टूडियो वेब एप्लीकेशन को संशोधित करना चाहता था। जब भी, मैं विजुअल स्टूडियो वेब एप्लीकेशन को विभिन्न वेब अनुप्रयोगों में संशोधित करने के बारे में सोचने की कोशिश करता हूं, घटकों के बीच परिपत्र निर्भरता सामने आती है जो गलत है। उदाहरण के लिए, मैं प्रत्येक नियोजित वेब अनुप्रयोग के लिए POCO प्रोजेक्ट को संशोधित नहीं कर सकता क्योंकि बहुत अधिक निर्भरता है। क्या कोई ऐसा तरीका है जिससे मैं न्यूगेट का उपयोग न्यूनाधिक करने में मदद कर सकता हूं
सीएस लुईस

जवाबों:


70

एक परियोजना को कई समाधानों द्वारा संदर्भित किया जा सकता है।

अपनी लाइब्रेरी या कोर कोड को एक परियोजना में रखें, फिर उस परियोजना को दोनों समाधानों में देखें।


150
ठीक है, लेकिन कैसे? कुछ निर्देश?
cja

2
यह (पुराना) उत्तर अपने आप में कई विधानसभाओं में होने के कारण अधूरा है: हालांकि, जब ILMerge के साथ युग्मित - विशेष रूप से आंतरिक विकल्प के साथ - यह एक बहुत शक्तिशाली समाधान बन जाता है।
user2246674

2
@ user2246674: कई विधानसभाओं के कारण यह अधूरा क्यों है? ओपी ने एक भी विधानसभा के बारे में कुछ नहीं कहा।
जॉन सॉन्डर्स

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

1
यह निर्भर करता है कि आप दूसरे उदाहरण से क्या मतलब रखते हैं। आप शायद कुछ और विवरणों के साथ एक नया प्रश्न शुरू करना चाहते हैं।
इलिवेविथियन

248

आप दो परियोजनाओं के बीच एक कोड फ़ाइल "लिंक" कर सकते हैं। अपनी परियोजना पर राइट क्लिक करें, चुनें Add-> Existing item, और फिर Addबटन के बगल में नीचे तीर पर क्लिक करें:

चित्रपट पकड़ना

मेरे अनुभव में एक पुस्तकालय बनाने की तुलना में लिंकिंग सरल है। एक एकल संस्करण के साथ एकल निष्पादन योग्य में लिंक किए गए कोड परिणाम।


9
मीठा - यही वह जवाब है जिसकी मुझे तलाश थी। मुझे DLL का संग्रह नहीं चाहिए था। चीयर्स
सीएडी

63
आप इसे इस तरह क्यों करेंगे? यही कारण है कि हमारे पास पुस्तकालय हैं, इनकैप्सुलेशन है। मुझे कोई व्यावसायिक समझ या तार्किक समझ नहीं है कि आप ऐसा क्यों करेंगे।
बजे रयान टर्निर

16
इसके अलावा आपके लिंक एक ही स्रोत नियंत्रण में नहीं हो सकते हैं। यह बहुत खतरनाक सुझाव है।
कुगेल

11
ऐसी परिस्थितियां हैं जहां यह समाधान उपयोगी है। एक उदाहरण के रूप में मैं InfoPath 2007 में विकसित कर रहा हूं जहां SharePoint में एक अलग DLL को तैनात करना सीधा नहीं है। InfoPath प्रपत्रों के बीच सामान्य कार्यक्षमता साझा करने के लिए लिंक की गई क्लास फ़ाइल दृष्टिकोण बहुत उपयोगी है। इसे व्यक्तिगत स्तर की परियोजनाओं के ऊपर एक स्तर पर रखा गया है और सब कुछ मूल स्तर पर नियंत्रित स्रोत है।
ओलिवर ग्रे

6
जैसा कि उपयोगिता का एक और उदाहरण कहता है कि आप दो एप्लिकेशन विकसित कर रहे हैं जिन्हें एक दूसरे से संवाद करने की आवश्यकता है। एक 64 बिट का है और दूसरा 32 का है, इसलिए आप जरूरी नहीं कि एक ही कोड से निर्मित अलग-अलग dll को संदर्भ प्रोजेक्ट के रूप में देखें। इस तरह से आप .h फ़ाइल के उपयोग की c कार्यक्षमता की नकल कर सकते हैं।
user912447

33

File > Add > Existing Project...आपको अपने वर्तमान समाधान में प्रोजेक्ट जोड़ने देगा। उपरोक्त पोस्टों में से कोई भी इसे जोड़ने के बाद से इसे इंगित करता है। यह आपको एक ही परियोजना को कई समाधानों में शामिल करने देता है।


1
यह काम करता है; नकारात्मक पक्ष यह दोनों परियोजनाओं को एक विधानसभा में नहीं बनाता है।
इयान बोयड

24

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

मुझे विश्वास नहीं है कि आप एक समाधान वास्तव में दूसरे पर निर्भर कर सकते हैं, लेकिन आप कस्टम स्क्रिप्ट के माध्यम से एक उपयुक्त क्रम में अपने स्वचालित निर्माण कर सकते हैं। मूल रूप से अपने सामान्य पुस्तकालय के साथ ऐसा व्यवहार करें जैसे कि यह NUnit इत्यादि जैसे किसी दूसरे पक्ष पर निर्भर हो।


परियोजना में ट्रैक होता है जहां नगेट पैकेज संग्रहीत होते हैं और इसे समाधान के उद्घाटन से बदला जा सकता है जिससे बिल्ड समय पर सिरदर्द हो सकता है इसलिए यह एक बेहतर समाधान है।
शेन कोर्ट्रेल

23

आप निम्नलिखित तकनीक का उपयोग करके वाइल्ड-कार्ड इनलाइन कर सकते हैं (जिस तरह से @ andomar का समाधान .cododj में सहेजा गया है)

<Compile Include="..\MySisterProject\**\*.cs">
  <Link>_Inlined\MySisterProject\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Compile>

इसमें डालें:

    <Visible>false</Visible>

यदि आप फ़ाइलों को छुपाना चाहते हैं और / या रोकना चाहते हैं तो वाइल्ड-कार्ड का विस्तार किया जा रहा है यदि आप किसी आइटम को MySisterProjectउपरोक्त 'आभासी मौजूदा आइटम' से जोड़ते या हटाते हैं ।


अच्छा है। यह एक अच्छा, हल्के समाधान की तरह दिखता है, अगर आप सजा को माफ कर देंगे।
सीएडी

@ कैड ब्लोके: यह निश्चित रूप से ठीक काम करता है (जैसा कि आपकी सज़ा :), लेकिन पहली बार में लिंक से बचने के लिए आपके अत्यंत प्रयास करने के लिए बहुत कुछ कहा गया है
रूबेन बर्टेलिंक

2
@ कैड ब्लोके: हां, यह मजेदार है। स्पष्टता के लिए मैं निम्नलिखित स्पष्ट रूप से कहूंगा कि यदि यह किसी को मदद करता है ... तो आप किसी प्रोजेक्ट को अनलोड कर सकते हैं / पुनः लोड कर सकते हैं ताकि बदलावों को प्राप्त कर सकें। (ऑल्ट-पी, एल दो बार)। VS2010 मुद्दा यह है कि .targets फ़ाइलें आदि <Import.csproj फाइलों में एड हो जाती हैं जब तक कि आप समाधानों को पुनः लोड नहीं करते जब तक आप कहते हैं।
रूबेन बार्टलिंक

3
यहाँ वाइल्डकार्ड थीम का मेरा नवीनतम संस्करण है ... <Compile शामिल करें = ".._ Src * *। " छोड़ें = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * ।; .._ Srt \ obj। * । * ; .._ Src ***। Csproj; .._ Src ***। उपयोगकर्ता; .._ Src ***। Vstemplate "> <Link> Src \% (RecursiveDir)% (Filename)% (एक्सटेंशन) <। / लिंक> </ संकलन>
सीएडी

1
@ChrisK यहाँ csproj फ़ाइल में मेरे संपादन पर कुछ और स्पष्टीकरण दिया गया है ... theswamp.org/index.php?topic=41850.msg472902#msg472902 । मैं इसे नोटपैड ++ में संपादित करता हूं। जब मैं इसे सहेजता हूं तो वीएस देखता है कि यह बदल गया है और फिर से लोड करने के लिए कहता है। इस व्यवहार को नियंत्रित करने के लिए VS में सेटिंग्स हैं।
सीएडी

18

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

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


मुझे लगता है कि अगर मैं एक बिल्ड ईवेंट बनाता हूं और संदर्भित प्रोजेक्ट में स्रोत नियंत्रित _lib फ़ोल्डर में dll प्रकाशित करता हूं, तो उस DLL में काम करेगा कि यह काम करता है .. लगता है कि
हैक

1
यदि आप हर बिल्ड को नियंत्रित करना चाहते हैं, तो आप एक बिल्ड टारगेट की जाँच कर सकते हैं लाइब्रेरी dlls, बिल्ड आउटपुट से कॉपी करें लाइब्रेरी फ़ोल्डर्स में, फिर dlls में चेक करें।
जॉन सॉन्डर्स

8

आप एक ही प्रोजेक्ट को एक से अधिक समाधानों में शामिल कर सकते हैं, लेकिन जब आप उदाहरण के लिए चारों ओर निर्देशिकाओं को स्थानांतरित करते हैं, तो सड़क के नीचे कभी-कभी समस्याओं में चलने की गारंटी दी जाती है (रिश्तेदार पथ अमान्य हो सकते हैं)

इसके साथ संघर्ष करने के वर्षों के बाद, मैं आखिरकार एक व्यावहारिक समाधान के साथ आया, लेकिन इसके लिए आपको स्रोत नियंत्रण के लिए सबवर्सन का उपयोग करना होगा (जो कि बुरी बात नहीं है)

अपने समाधान के निर्देशिका स्तर पर, एक svn जोड़ें : बाह्य संपत्ति जो आप अपने समाधान में शामिल करना चाहते हैं उन परियोजनाओं की ओर इशारा करते हैं। तोड़फोड़ परियोजना को रिपॉजिटरी से खींच लेगा और इसे आपकी समाधान फ़ाइल के सबफ़ोल्डर में संग्रहीत करेगा। आपकी समाधान फ़ाइल आपकी परियोजना को संदर्भित करने के लिए बस सापेक्ष रास्तों का उपयोग कर सकती है।

अगर मुझे कुछ और समय मिलता है, तो मैं इसे विस्तार से बताऊंगा।


अपनी परियोजनाओं को परिभाषित करने में, केवल रिश्तेदार रास्तों का उपयोग करना सुनिश्चित करें ... जो कि, विशेष रूप से पुन: प्रयोज्य के लिए, एक छोटी समस्या से अधिक हल करना चाहिए।
xtofl

5
बस संदर्भ के लिए, svn:externalsएक भंडार के लिए कठिन लिंक। जब आप रिपॉजिटरी को स्थानांतरित करते हैं, तो बाहरी लिंक अभी भी पुराने रिपॉजिटरी की ओर इशारा करते हैं।
एंडोमर

गिट के लिए आप सबट्री एसवीएन का
माइकल फ्रीजिम

8

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


5

डीएल क्लास लाइब्रेरी बनाना एक अच्छा विचार है जिसमें सभी सामान्य कार्यक्षमता शामिल हैं। प्रत्येक समाधान इस dll को अन्य समाधानों की परवाह किए बिना अनिश्चित काल के लिए संदर्भित कर सकता है।

वास्तव में, यह है कि हमारे काम में मेरे स्रोतों का आयोजन किया जाता है (और मुझे कई अन्य स्थानों पर विश्वास है)।

वैसे, समाधान स्पष्ट रूप से दूसरे समाधान पर निर्भर नहीं हो सकता है।


1
मेरा मानना ​​है कि यह इस सवाल का सबसे बड़ा बिंदु है जो एक टन लोगों को स्पष्ट रूप से नहीं मिलता है।
डेल ली

5

इसमें शामिल दो मुख्य चरण हैं

1- C ++ dll बनाना

दृश्य स्टूडियो में

New->Project->Class Library in c++ template. Name of project here is first_dll in 
visual studio 2010. Now declare your function as public in first_dll.h file and 
write the code in first_dll.cpp file as shown below.

हैडर फ़ाइल कोड

// first_dll.h

using namespace System;

namespace first_dll 
{

public ref class Class1
{
public:
    static double sum(int ,int );
    // TODO: Add your methods for this class here.
};
}

सीपीपी फ़ाइल

//first_dll.cpp
#include "stdafx.h"

#include "first_dll.h"

namespace first_dll
{

    double Class1:: sum(int x,int y)
    {
        return x+y;
    }

 }

इसे देखो

**Project-> Properties -> Configuration/General -> Configuration Type** 

यह विकल्प डायनामिक लाइब्रेरी (.dll) होना चाहिए और अब समाधान / परियोजना का निर्माण करना चाहिए ।

first_dll.dll फ़ाइल डीबग फ़ोल्डर में बनाई गई है

2- इसे C # प्रोजेक्ट में जोड़ना

C # प्रोजेक्ट खोलें

Rightclick on project name in solution explorer -> Add -> References -> Browse to path 
where first_dll.dll is created and add the file.

इस लाइन को C # प्रोजेक्ट में शीर्ष पर जोड़ें

Using first_dll; 

अब dll से फ़ंक्शन को किसी फ़ंक्शन में नीचे कथन का उपयोग करके एक्सेस किया जा सकता है

double var = Class1.sum(4,5);

मैंने VS2010 में c ++ प्रोजेक्ट में dll बनाया और इसका उपयोग VS2013 C # प्रोजेक्ट में किया। यह अच्छी तरह से काम करता है।



4

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


कैसे काम करता है स्टिवोनी? क्या आप अधिक जानकारी प्रदान कर सकते हैं?
स्टीव डुन

@SteveDunn मैंने अपने बहुत ही अपडेटेड ब्लॉग (बेवकूफ स्कूल और काम को जीवन में मजेदार चीज के रूप में प्राप्त करने के लिए) पर कैसे-कैसे पोस्ट किया। यह यहां
स्टीवो जूल

4

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

अलग-अलग बाहरी असेंबली के संदर्भों के साथ कई असेंबली बनाना आपके कोड को नकल किए बिना, या स्रोत कोड नियंत्रण के साथ चाल का उपयोग किए बिना करना आसान नहीं है।

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


2

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


2

VisualStudio 2015 के अनुसार, यदि आप अपने सभी कोड को एक समाधान में रखते हैं, तो आप साझा प्रोजेक्ट जोड़कर कोड साझा कर सकते हैं । फिर प्रत्येक साझा प्रोजेक्ट के लिए इस साझा प्रोजेक्ट का संदर्भ जोड़ें, जिसमें आप कोड का उपयोग करना चाहते हैं, साथ ही साथ निर्देशों का सही उपयोग भी कर सकते हैं।


2

अब आप साझा परियोजना का उपयोग कर सकते हैं

साझा परियोजना कई एप्लिकेशन में साझा कोड साझा करने का एक शानदार तरीका है। हमने पहले से ही विंडोज 8.1 यूनिवर्सल ऐप डेवलपमेंट के हिस्से के रूप में विज़ुअल स्टूडियो 2013 में साझा प्रोजेक्ट प्रकार के साथ अनुभव किया है, लेकिन विज़ुअल स्टूडियो 2015 के साथ, यह एक स्टैंडअलोन न्यू प्रोजेक्ट टेम्पलेट है; और हम इसे अन्य प्रकार के एप्लिकेशन जैसे कंसोल, डेस्कटॉप, फोन, स्टोर ऐप आदि के साथ उपयोग कर सकते हैं। इस प्रकार की परियोजना अत्यंत उपयोगी है जब हम एक समान कोड, लॉजिक के साथ-साथ कई अनुप्रयोगों के घटकों को एक मंच में साझा करना चाहते हैं। । यह प्लेटफ़ॉर्म-विशिष्ट एपीआई की संपत्ति, आदि को एक्सेस करने की अनुमति देता है।

यहां छवि विवरण दर्ज करें

अधिक जानकारी के लिए इसे देखें

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