Як використовувати клас з одного проекту C # з іншим проектом C #


110

У цьому ж рішенні я маю два проекти: P1 та P2. Як я можу скористатися класом P1 у P2?


Дуже схоже запитання тут
RBT

Відповіді:


65

Просто додайте посилання на P1 від P2


12
Це не спрацює, якщо клас не публічний або якщо P2 є другом P1.
Манфред

7
У цьому випадку у вас є 3 варіанти: 1) Об'єднайте 2 проекти 2) Зробіть клас внутрішнім - і додайте P2 як атрибут "InternalsVisibleTo" (більше інформації тут: msdn.microsoft.com/en-us/library/… ). 3) Якщо нічого з перерахованого вище неможливо зробити - вам доведеться використовувати відображення, щоб миттєво вмикати і викликати клас P1 від P2
Nissim

21
Я вважав за краще більш детальну відповідь. Цей відчуває себе майже саркастично.
штевен

5
Приклад був би кращим.
Пол Олександр

1
Також обидва проекти повинні орієнтуватися на однакові рамки .NET. Перевірте властивості кожного проекту на вкладці "Застосування", там має бути "Цільова рамка". Обидва проекти мають націлюватись на однакові рамки.
Тревіс

193
  1. У дереві «Провідник рішень» розгорніть проект P2, а потім клацніть правою кнопкою миші проект та виберіть у меню «Додати довідку».
  2. У діалоговому вікні "Додати довідку" виберіть вкладку "Проекти" та виберіть проект P1.
  3. Якщо ви використовуєте простори імен, вам потрібно буде імпортувати простори імен для своїх типів P1, додавши до файлів у P2 виписки "using".

Зауважте, що типи P1, до яких ви бажаєте отримати доступ безпосередньо, повинні мати достатній рівень доступу: зазвичай це означає, що вони повинні бути оприлюднені.


Чудова порада, сер. Раніше я вставляв посилання, але потім доводилося оновлювати їх щоразу, коли змінював шлях до файлу. З посиланням на проект все набагато простіше. Дякую!
IneedHelp

2
Що робити, якщо ви вже маєте посилання на P2 в P1? Виконання вищезазначеного створило б "кругову залежність" ...
кольд

4
@colmde так. Вам слід буде абстрагувати елементи, якими ви хочете поділитися в третьому проекті, який ви можете образно назвати P3, на який посилаються два інші проекти.
Пол Руан

Як розробник, який не є NET, я дійсно думаю, що це має бути прийнятою відповіддю ... Дякую Паулу (x2)
thisIsTheFoxe

16

Пол Руан правильно, я щойно спробував себе, будуючи проект. Я просто зробив цілий SLN, щоб перевірити, чи спрацював він.

Я зробив це у VC # VS2008

<< (Просто допомагаю іншим, хто читає це, також (() коментарями)

Крок 1:

Зробіть рішення під назвою DoubleProject

Крок 2:

Зробіть Project у рішенні з назвою DoubleProjectTwo (для цього виберіть файл рішення, клацніть правою кнопкою миші -> Додати -> Новий проект)

У мене зараз два проекти в одному і тому ж рішенні

Крок 3:

Як заявив Пол Руан. перейдіть до посилань у провіднику рішень (якщо він закритий - це вкладка перегляду компілятора). DoubleProjectTwo - це одна з необхідних функцій / методів DoubleProject, тому в DoubleProjectTwo праворуч посилання миші там -> Додати -> Проекти -> 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();
        }
    }
}

ЦЕ ПОТРІБНО робити трюк

Сподіваюся, це допомагає

EDIT ::: whoops забув виклик методу фактично змінити рядок, не робіть те саме :)


9

Занадто часто новий розробник задає це просте запитання, яке є загальною проблемою саме для IDE Visual Studio. Мало хто відповідає на конкретне запитання і часто критикує це питання або дає "здогадки" для рішень, які не відповідають загальним проблемам. Перша поширена проблема полягає в тому, що IDE спонукає вас створювати нові проекти, а не додавати нові файли (.java, .py, .cpp, .c) до існуючого рішення (за замовчуванням він створює нове рішення), якщо ви не змінюєте назву проекту і додати до поточного рішення. Ця проблема виникає для папок проектів Python, java, c #, C ++ та C.

Це не відбувається, коли ви додаєте інший проект, використовуючи нові> проект> команди типу проекту IDE. Проблема тут полягає в тому, що новий проект зберігається в іншому каталозі, ніж у існуючих файлах коду Клієнта або Користувача. Щоб створити новий "файл" у тому самому просторі проекту, а не новий проект, початківцю потрібно зробити наступне, що Microsoft не зробить для вас і навіть введе вас в оману від інтуїтивно очевидного за замовчуванням.

  1. Виберіть "додаток", до якого потрібно імпортувати нову поведінку (з іншого файлу)
  2. Виберіть проект> додати новий елемент
  3. Виберіть "тип шаблону програмного файлу", наприклад filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C # тощо, або тип файлу класу бібліотеки (щось інше, ніж параметри файлів запуску, які ви бачите під час створення новий прикладний проект або створити новий проект бібліотеки).
  4. У вашому проекті створюється нове ім’я файлу з іменем за замовчуванням.
  5. Змініть ім'я файлу за замовчуванням на щось на зразок library.py або façade.java тощо.

СЕЙЧАС рекомендації щодо коду щодо імпорту бібліотек або використання просторів імен будуть працювати, як описано в коментарях вище, і вам не доведеться змінювати оператори шляху або змінювати шляхи рішення та імена рішення, які Microsoft не дозволить вам легко змінити (тобто ви можете змінити назви файлів або назви проектів, але IDE не змінить автоматично проектний шлях або назви шляхів рішення).

Далі наводиться приклад Python, але працює аналогічно для C #, java або C / C ++, використовуючи простори імен або використовуючи команди коду, відповідні кожній мові для пошуку коду в інших класах / проектах в ІДНІЙ ДИРЕКЦІЙНОМ ПРОСТОРІ.

Файл програми "привіт світ" імпортує з інших файлів коду в той самий каталог.

Зверніть увагу, що роздільники пробілів пітону не мають пробілу правильно в цьому редакторі коментарів stackoverflow:

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. Вам потрібно перейти до параметрів індексатора чи "intellisense" та компілятора / інтерпретатора та фізично перевірити або змінити / додати заяви контуру каталогів, якщо вони є чимось іншим, ніж те, що вказує на ваш "другий" простір проекту чи рішення. Коли ви змінюєте шлях або змінюєте змінні шляху до вашої робочої області та до конкретних локацій проектів, які є різними просторами каталогів, компілятор та аналізатор коду можуть потім знайти ці бібліотеки, headers.h, простори імен, місця розташування проектів або файлів.
  2. Видалити старі проекти, які ви створили помилково, ще гірше. Вам потрібно вийти з ID ID Visual Studio, відкрити провідник Windows, перейти в каталог робочої області ... Документи \ visualstudio xxx \ рішення імені \ ім'я пакета виберіть файл або папку, клацніть правою кнопкою миші та «видаліть» файл чи папку.
  3. Коли ви повторно вводите IDE та вибираєте відкрите рішення чи відкритий пакет / рішення, старі файли та назви рішення / пакету пропадають, як і їхні оманливі заяви про шлях, які обдурюють компілятор та аналізатор коду, щоб переглянути старий каталог, навіть якщо ви змінили ім'я файлу та змінено ім'я проекту, воно не змінює шлях до каталогу до нього.

Майкрософт дійсно потребує виправлення цієї проблеми, щоб ви могли інтуїтивно створювати те, що більшість людей хоче створити як нові файли в тих самих каталогах, і видаляти рішення, вибираючи їх та видаляючи їх з IDE. Початківці настільки засмучені висловлюваннями каталогізних маршрутів, настільки гнучкими для досвідчених розробників, але настільки несправедливими до нових розробників у своїх налаштуваннях.

Сподіваємось, це справді допомагає вам, нові хлопці, і не дозволяє досвідченим розробникам давати вам неправильні відповіді, які не працюють для вас. Вони припускають, що ви вже розумієте заяви про шлях і просто хочете ввести правильний код ... саме тому тунель намагається виправити ваш код, але не допомагає вирішити проблему. Це, мабуть, найпоширеніша проблема, яка постійно описується в stackoverflow з неправильними відповідями, які не працюють для нових програмістів.


Щоб узагальнити цю відповідь (для VS 2017): клацніть правою кнопкою миші P1 в провіднику рішень >>> додайте… >>> посилання… >>> Проекти >>> Рішення >>> Установіть прапорець P2.
андрю паштет

7

Перший крок - зробити P2 посиланням P1, виконавши наступне

  • Клацніть правою кнопкою миші на проект та виберіть "Додати довідку"
  • Перейдіть на вкладку Проекти
  • Виберіть P1 і натисніть ОК

Далі потрібно переконатися, що класи P1 доступні для P2. Найпростіший спосіб - зробити їх public.

public class MyType { ... }

Тепер ви зможете використовувати їх у P2 через їх повне ім'я. Якщо припустити, що простір імен P1 є Project1, то працює наступне

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

Однак кращим способом є додавання для використання, Project1щоб ви могли використовувати типи без кваліфікації

using Project1;
...

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

5

Якщо у вас є два проекти в одній папці рішення. Просто додайте довідку проекту в іншу. Використовуючи простір імен, ви можете отримати класи. Під час створення об'єкта для цього запитуваного класу. Назвіть потрібний метод.

Перший проект:

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

Тут додайте посилання на Другий проект

Другий проект:

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

4

У проекті P1 зробіть клас загальнодоступним (якщо його ще немає). Потім додайте посилання на проект (а не посилання на файл, помилка, з якою я стикався періодично) до P2. Додайте користувальницький оператор у P2 у потрібному місці та почніть використовувати клас з P1.

(Якщо згадати про це: Альтернативою для того, щоб оприлюднити клас, було б зробити P2 другом P1. Це, однак, навряд чи буде вашою відповіддю, оскільки це матиме певні наслідки. Тому дотримуйтесь наведеної вище пропозиції.)


2

Скажімо, ваш клас у проекті 2 називається MyClass.

Очевидно, спочатку посилайтесь на свій проект 2 під посиланнями в проекті 1

using namespaceOfProject2;

// for the class calling bit:

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

тому коли ви хочете посилатися на цей клас, ви вводите project2Class. Плюс також переконайтеся, що і клас загальнодоступний.


1

У мене виникла проблема з різними цільовими рамками.

Я все робив правильно, але просто не міг використати посилання в P2. Після того, як я встановив однакові цільові рамки для P1 та P2, це спрацювало як шарм.

Сподіваюся, це комусь допоможе


У мене була така ж проблема, з такими помилками, як, The name ... does not exist in the current context. Cannot resolve symbol ...поки я не змінив цільові рамки проектів на відповідність. (Клацніть правою кнопкою миші проект і перейти до Project -> Properties -> Target frameworkзмінити це.)
Синку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.