एक C # प्रोजेक्ट से दूसरी C # प्रोजेक्ट वाली क्लास का उपयोग कैसे करें


110

एक ही समाधान में, मेरे पास दो परियोजनाएं हैं: पी 1 और पी 2। मैं पी 2 में पी 1 के वर्ग का उपयोग कैसे कर सकता हूं?


इसी तरह का सवाल यहाँ
RBT

जवाबों:


65

बस पी 2 से पी 1 का संदर्भ जोड़ें


12
यह काम नहीं करेगा यदि वर्ग गैर-सार्वजनिक है या यदि पी 2 पी 1 का मित्र है।
मैनफ्रेड

7
इस स्थिति में आपके पास 3 विकल्प हैं: 1) 2 परियोजनाओं को मिलाएं 2) वर्ग को आंतरिक बनाएं - और P2 को " इंटरनैल्सविजेंटलो " विशेषता के रूप में जोड़ें (अधिक जानकारी यहां: msdn.microsoft.com/en-us/library/… )। 3) यदि उपरोक्त में से कोई भी नहीं किया जा सकता है - तो आपको पी 2 से पी 2 से कक्षा P1 को तत्काल और आह्वान करने के लिए प्रतिबिंब का उपयोग करना होगा
निस्सीम

21
मैंने अधिक विस्तृत जवाब पसंद किया होगा। यह लगभग व्यंग्यात्मक लगता है।
शेट्टीवेन

5
एक उदाहरण बेहतर होता।
पॉल अलेक्जेंडर

1
इसके अलावा, दोनों परियोजनाओं को एक ही .NET फ्रेमवर्क को लक्षित करने की आवश्यकता है। 'अनुप्रयोग' टैब पर प्रत्येक परियोजना के गुणों की जाँच करें 'लक्ष्य रूपरेखा' होनी चाहिए। दोनों परियोजनाओं को यहां समान ढांचे को लक्षित करने की आवश्यकता है।
ट्रैविस

193
  1. 'सॉल्यूशन एक्सप्लोरर' ट्री में, P2 प्रोजेक्ट का विस्तार करें और फिर प्रोजेक्ट पर राइट-क्लिक करें और मेनू से 'Add Reference' चुनें।
  2. 'संदर्भ जोड़ें' संवाद पर, 'प्रोजेक्ट्स' टैब चुनें और अपना P1 प्रोजेक्ट चुनें।
  3. यदि आप नेमस्पेस का उपयोग कर रहे हैं, तो आपको पी 2 में अपनी फाइलों में 'स्टेटमेंट' का उपयोग करके अपने पी 1 प्रकारों के लिए नेमस्पेस को आयात करना होगा।

ध्यान दें कि P1 के प्रकार जिन्हें आप सीधे एक्सेस करना चाहते हैं, उनके पास एक पर्याप्त एक्सेस स्तर होना चाहिए: आमतौर पर इसका मतलब है कि उन्हें सार्वजनिक किया जाना चाहिए।


बहुत बढ़िया सलाह, सर। मैं लिंक पेस्ट करता था, लेकिन तब मुझे उन्हें हर बार अपडेट करना पड़ता था जब मैंने फ़ाइल का रास्ता बदल दिया। एक परियोजना संदर्भ के साथ सब बहुत आसान है। धन्यवाद!
ineedHelp

2
क्या होगा यदि आपके पास पहले से पी 1 में पी 2 का संदर्भ है? उपरोक्त करने से एक "परिपत्र निर्भरता"
बनेगी

4
@colmde हाँ यह होगा। आपको उन तत्वों को अलग करना होगा जिन्हें आप एक तीसरी परियोजना में साझा करना चाहते हैं, जिसे आप कल्पनाशील रूप से पी 3 शीर्षक दे सकते हैं, जिसे अन्य दो परियोजनाओं द्वारा संदर्भित किया गया है।
पॉल रूएन

एक गैर-नेट डेवलपर के रूप में, मुझे वास्तव में लगता है कि यह स्वीकृत उत्तर होना चाहिए ... धन्यवाद पॉल (x2)
thisIsTheFoxe

16

पॉल रुआन सही है, मैंने सिर्फ प्रोजेक्ट बनाने की कोशिश की है। मैं सिर्फ एक पूरी एसएलएन परीक्षण करने के लिए अगर यह काम किया है।

मैंने इसे VC # VS2008 में बनाया

<< (सिर्फ अन्य लोगों की मदद करना जो इस टिप्पणी के साथ पढ़ते हैं)

चरण 1:

DoubleProject नामक समाधान करें

चरण 2:

DoubleProjectTwo नाम से प्रोजेक्ट बनाएं (इसे करने के लिए समाधान फ़ाइल का चयन करें, राइट क्लिक करें -> जोड़ें -> नई परियोजना)

मेरे पास अब एक ही समाधान में दो परियोजनाएं हैं

चरण 3:

जैसा कि पॉल रुआन ने कहा था। समाधान एक्सप्लोरर में संदर्भ पर जाएं (यदि यह संकलक के दृश्य टैब में बंद है)। DoubleProjectTwo DoubleProjectTwo में एक आवश्यक कार्य / तरीके हैं ताकि DoubleProjectTwo में सही माउस संदर्भ हो -> Add -> Projects -> DoubleProject।

चरण 4:

नाम स्थान के लिए निर्देश शामिल करें:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DoubleProject; <------------------------------------------

namespace DoubleProjectTwo
{
    class ClassB
    {
        public string textB = "I am in Class B Project Two";
        ClassA classA = new ClassA();


        public void read()
        {
            textB = classA.read();
        }
    }
}

चरण 5:

मुझे कुछ दिखाओ परिणाम के सबूत:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DoubleProject
{
    public class ClassA    //<---------- PUBLIC class
    {
        private const string textA = "I am in Class A Project One";

        public string read()
        {
            return textA;
        }
    }
}

मुख्य

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DoubleProjectTwo;  //<----- to use ClassB in the main

namespace DoubleProject
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassB foo = new ClassB();

            Console.WriteLine(foo.textB);
            Console.ReadLine();
        }
    }
}

यह ट्रिक काम आना चाहिए

उम्मीद है की यह मदद करेगा

संपादित करें ::: जो वास्तव में स्ट्रिंग को बदलने के लिए विधि कॉल भूल गया, वही मत करो :)


9

सभी अक्सर एक नया डेवलपर यह सरल प्रश्न पूछता है जो विशेष रूप से विजुअल स्टूडियो आईडीई के साथ एक आम समस्या है। कुछ लोग विशिष्ट प्रश्न का उत्तर देते हैं और अक्सर प्रश्न की आलोचना करते हैं या समाधान के लिए "अनुमान" देते हैं जो सामान्य समस्याओं का जवाब नहीं देते हैं। पहली आम समस्या यह है कि आईडीई आपको मौजूदा समाधान के लिए नई फ़ाइलों (.java, .py, .cpp, .c) को जोड़ने के बजाय नई परियोजनाएं बनाने की ओर ले जाता है (जब तक कि यह परियोजना का नाम नहीं बदलता है)। और वर्तमान समाधान में जोड़ें। यह समस्या पायथन, जावा, सी #, सी ++ और सी प्रोजेक्ट फ़ोल्डर्स के लिए होती है।

ऐसा तब नहीं होता है जब आप IDE के नए> प्रोजेक्ट> प्रोजेक्ट प्रकार कमांड का उपयोग करके कोई अन्य प्रोजेक्ट जोड़ते हैं। यहां समस्या यह है कि नई परियोजना मौजूदा क्लाइंट या उपयोगकर्ता इंटरफ़ेस कोड फ़ाइलों की तुलना में एक अलग निर्देशिका में संग्रहीत है। नए प्रोजेक्ट के बजाय एक ही प्रोजेक्ट स्पेस में एक नई "फाइल" बनाने के लिए शुरुआत करने वाले को निम्नलिखित करने की आवश्यकता होती है जो Microsoft आपके लिए नहीं करेगा और यहां तक ​​कि आपको डिफ़ॉल्ट रूप से सहज रूप से स्पष्ट से दूर कर देता है।

  1. "व्यवहार" का चयन करें जिसे आप नए व्यवहार को (किसी अन्य फ़ाइल से) आयात करना चाहते हैं
  2. प्रोजेक्ट> नई आइटम जोड़ें चुनें
  3. "प्रोग्राम फ़ाइल टेम्प्लेट प्रकार" जैसे कि filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C #, आदि या एक लाइब्रेरी क्लास फ़ाइल प्रकार (स्टार्टअप फ़ाइल के अलावा कुछ और विकल्प जो आप बनाते हैं, देखें) चुनें। एक नया एप्लिकेशन प्रोजेक्ट या एक नया लाइब्रेरी प्रोजेक्ट बनाएं)।
  4. आपकी परियोजना में डिफ़ॉल्ट नाम के साथ एक नया फ़ाइल नाम बनाया गया है।
  5. फ़ाइल का डिफ़ॉल्ट नाम कुछ लाइब्रेरी लाइब्रेरी या façade.java, आदि में बदलें।

अब पुस्तकालयों को आयात करने या नाम स्थान का उपयोग करने के लिए कोड की सिफारिशें ऊपर की टिप्पणियों में वर्णित के रूप में काम करेंगी और आपको पथ कथन बदलने या समाधान पथ और समाधान नाम बदलने की आवश्यकता नहीं है जो Microsoft आपको आसानी से बदलने नहीं देगा (अर्थात आप बदल सकते हैं फ़ाइल नाम या प्रोजेक्ट नाम लेकिन IDE स्वचालित रूप से प्रोजेक्ट पथ या समाधान पथ नाम नहीं बदलेगा)।

निम्नलिखित पायथन उदाहरण है, लेकिन समान भाषा में अन्य वर्गों / परियोजनाओं में कोड खोजने के लिए प्रत्येक भाषा में शामिल कोड, नामस्थान या कोड कमांड का उपयोग करके C #, java, या C / C ++ के लिए समान काम करता है।

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

ध्यान दें कि इस स्टैकओवरफ्लो टिप्पणी संपादक में अजगर सफेद स्थान के सीमांकक सही ढंग से नहीं जा रहे हैं:

print ("test")

from CIXMPythonFacade import ClassA

c1=ClassA
c1.methodA()

from CIXMPythonFacade import functionA 

functionA()


class ClassName(object): 
         def __init__(object, parameter):
         object.parameter = value

लाइब्रेरी फ़ाइल या "फ़ेकडे" फ़ाइल जिसमें आप आयात करना चाहते हैं, कक्षाएं, विधियाँ या फ़ंक्शंस हैं।

class class1(object):
    """description of class"""

class ClassA(object):
    print ("test2")
    def methodA():
        print ("test3")

def functionA ():
    print ("test4")
    return (0)


pass

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

  1. एप्लिकेशन फ़ाइल का चयन करें
  2. प्रोजेक्ट> संदर्भ जोड़ें का चयन करें
  3. सही निर्देशिका पथ के साथ दिखाई देने वाला फ़ाइल नाम चुनें (इसे देखें)
  4. संदर्भ अब दुभाषिया, कोड चेकर और / या संकलक के लिए उपलब्ध है।

ठीक है तो अब जब आपको यह समस्या हल हो गई है, तो आप वास्तव में एक ही समाधान स्थान में दो अलग-अलग परियोजनाओं को एक साथ कैसे लिंक करते हैं?

  1. आपको अनुक्रमणिका या "इंटैलिसेन्स" विकल्प और कंपाइलर / दुभाषिया दोनों पर जाना होगा और निर्देशिका पथ विवरणों को भौतिक रूप से जांचना / बदलना / जोड़ना होगा यदि वे आपके "दूसरे" प्रोजेक्ट या समाधान स्थान के लिए कुछ बिंदुओं से अलग हैं। जब आप पथ परिवर्तन करते हैं या पथ चर को अपने कार्यक्षेत्र और परियोजनाओं के विशिष्ट स्थानों पर बदलते हैं जो अलग निर्देशिका स्थान संकलक हैं और कोड विश्लेषक तब इन पुस्तकालयों, हेडर.एच, नेमस्पेस, प्रोजेक्ट या फ़ाइल स्थानों का पता लगा सकते हैं।
  2. आपके द्वारा गलती से बनाई गई पुरानी परियोजनाओं को हटाने के लिए यह और भी बुरा है। आपको Visual Studio IDE से बाहर निकलना होगा, विंडोज़ एक्सप्लोरर खोलना होगा, कार्यक्षेत्र निर्देशिका में जाना होगा ... दस्तावेज़ \ Visualstudio xxx \ solutionname \ packagename फ़ाइल या फ़ोल्डर का चयन करें, राइट क्लिक करें और फ़ाइल या फ़ोल्डर को "हटाएं"।
  3. जब आप आईडीई में फिर से प्रवेश करते हैं और खुले समाधान या खुले पैकेज / समाधान का चयन करते हैं, तो पुरानी फाइलें और समाधान / पैकेज नाम चले गए हैं क्योंकि उनके भ्रामक पथ कथन हैं जो संकलक और कोड विश्लेषक को बेवकूफ बनाते हैं, भले ही आप बदल गए हों। फ़ाइल नाम और परियोजना का नाम बदल दिया है, यह इसके साथ निर्देशिका पथ नहीं बदलता है।

Microsoft को वास्तव में, वास्तव में इन समस्याओं को ठीक करने की आवश्यकता है ताकि आप सहजता से यह बना सकें कि अधिकांश लोग एक ही निर्देशिका में नई फ़ाइलों के रूप में क्या बनाना चाहते हैं और समाधानों को हटाकर उन्हें IDE से हटा दें। शुरुआती सीज़न डेवलपर्स के लिए इतनी लचीली डायरेक्टरी पाथ स्टेटमेंट से निराश हो जाते हैं, लेकिन नए डिफॉल्टर्स के साथ ऐसा करना अनुचित है।

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


इस उत्तर (वीएस 2017 के लिए) को संक्षेप में प्रस्तुत करने के लिए: समाधान एक्सप्लोरर में राइटक्लिक P1 >>> Add ... >>> संदर्भ ... >>> प्रोजेक्ट >>> समाधान >>> P2 चेकबॉक्स की जांच करें।
andrew pate

7

पहला कदम निम्नलिखित करके P2 संदर्भ P1 बनाना है

  • प्रोजेक्ट पर राइट क्लिक करें और "संदर्भ जोड़ें" चुनें
  • प्रोजेक्ट्स टैब पर जाएं
  • P1 का चयन करें और ओके हिट करें

आगे आपको यह सुनिश्चित करने की आवश्यकता होगी कि पी 1 में कक्षाएं पी 2 तक पहुंच योग्य हैं। सबसे आसान तरीका उन्हें बनाना है public

public class MyType { ... }

अब आप उन्हें पूरी तरह से योग्य नाम के माध्यम से P2 में उपयोग करने में सक्षम होना चाहिए। P1 के नाम स्थान को प्रोजेक्ट 1 मान लें तो निम्नलिखित कार्य करेगा

Project1.MyType obj = new Project1.MyType();

हालांकि पसंदीदा तरीका यह है कि आप इसके लिए एक Project1योग्यता जोड़ सकते हैं, ताकि आप बिना योग्यता के प्रकारों का उपयोग कर सकें

using Project1;
...

public void Example() {
  MyType obj = new MyType();
}

5

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

FirstProject:

class FirstClass()
{
   public string Name()
   {
      return "James";
   }
}

यहां दूसरी परियोजना का संदर्भ जोड़ें

SecondProject:

class SeccondClass
{
    FirstProject.FirstClass obj=new FirstProject.FirstClass();
    obj.Name();
}

4

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

(इसका उल्लेख करने के लिए: वर्ग को सार्वजनिक करने का विकल्प पी 2 को P1 बनाने के लिए एक मित्र होगा। हालांकि, इसका उत्तर होने की संभावना नहीं है क्योंकि आप इसके कुछ परिणाम होंगे। इसलिए उपरोक्त सुझाव के साथ रहें।)


2

प्रोजेक्ट 2 में आपकी कक्षा को MyClass कहा जाता है।

जाहिर है, पहले अपने प्रोजेक्ट 2 को प्रोजेक्ट 1 में संदर्भ के तहत देखें

using namespaceOfProject2;

// for the class calling bit:

namespaceOfProject2.MyClass project2Class = new namespaceOfProject2.MyClass();

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


1

मेरे पास अलग-अलग लक्ष्य ढांचे के साथ एक मुद्दा था।

मैं सब कुछ सही कर रहा था, लेकिन सिर्फ P2 में संदर्भ का उपयोग नहीं कर सका। पी 1 और पी 2 के लिए समान लक्ष्य रूपरेखा निर्धारित करने के बाद, इसने एक आकर्षण की तरह काम किया।

आशा है कि यह किसी की मदद करेगा


मेरे पास एक ही मुद्दा था, त्रुटियों के साथ The name ... does not exist in the current context. Cannot resolve symbol ...जब तक कि मैंने मिलान करने के लिए परियोजनाओं के लक्ष्य ढांचे को नहीं बदला। (प्रोजेक्ट को राइट-क्लिक करें और Project -> Properties -> Target frameworkइसे बदलने के लिए जाएं।)
सन्नी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.