У цьому ж рішенні я маю два проекти: P1 та P2. Як я можу скористатися класом P1 у P2?
У цьому ж рішенні я маю два проекти: P1 та P2. Як я можу скористатися класом P1 у P2?
Відповіді:
Просто додайте посилання на P1 від P2
Зауважте, що типи P1, до яких ви бажаєте отримати доступ безпосередньо, повинні мати достатній рівень доступу: зазвичай це означає, що вони повинні бути оприлюднені.
Пол Руан правильно, я щойно спробував себе, будуючи проект. Я просто зробив цілий 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 забув виклик методу фактично змінити рядок, не робіть те саме :)
Занадто часто новий розробник задає це просте запитання, яке є загальною проблемою саме для IDE Visual Studio. Мало хто відповідає на конкретне запитання і часто критикує це питання або дає "здогадки" для рішень, які не відповідають загальним проблемам. Перша поширена проблема полягає в тому, що IDE спонукає вас створювати нові проекти, а не додавати нові файли (.java, .py, .cpp, .c) до існуючого рішення (за замовчуванням він створює нове рішення), якщо ви не змінюєте назву проекту і додати до поточного рішення. Ця проблема виникає для папок проектів Python, java, c #, C ++ та C.
Це не відбувається, коли ви додаєте інший проект, використовуючи нові> проект> команди типу проекту IDE. Проблема тут полягає в тому, що новий проект зберігається в іншому каталозі, ніж у існуючих файлах коду Клієнта або Користувача. Щоб створити новий "файл" у тому самому просторі проекту, а не новий проект, початківцю потрібно зробити наступне, що Microsoft не зробить для вас і навіть введе вас в оману від інтуїтивно очевидного за замовчуванням.
СЕЙЧАС рекомендації щодо коду щодо імпорту бібліотек або використання просторів імен будуть працювати, як описано в коментарях вище, і вам не доведеться змінювати оператори шляху або змінювати шляхи рішення та імена рішення, які 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? Щоб імпортувати код з іншого файлу в тому ж просторі каталогу, ви додасте посилання на нього.
ОК, тож тепер, коли ви вирішили цю проблему, як ви насправді пов’язуєте два окремих проекти разом в одному просторі рішення?
Майкрософт дійсно потребує виправлення цієї проблеми, щоб ви могли інтуїтивно створювати те, що більшість людей хоче створити як нові файли в тих самих каталогах, і видаляти рішення, вибираючи їх та видаляючи їх з IDE. Початківці настільки засмучені висловлюваннями каталогізних маршрутів, настільки гнучкими для досвідчених розробників, але настільки несправедливими до нових розробників у своїх налаштуваннях.
Сподіваємось, це справді допомагає вам, нові хлопці, і не дозволяє досвідченим розробникам давати вам неправильні відповіді, які не працюють для вас. Вони припускають, що ви вже розумієте заяви про шлях і просто хочете ввести правильний код ... саме тому тунель намагається виправити ваш код, але не допомагає вирішити проблему. Це, мабуть, найпоширеніша проблема, яка постійно описується в stackoverflow з неправильними відповідями, які не працюють для нових програмістів.
Перший крок - зробити P2 посиланням 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();
}
Якщо у вас є два проекти в одній папці рішення. Просто додайте довідку проекту в іншу. Використовуючи простір імен, ви можете отримати класи. Під час створення об'єкта для цього запитуваного класу. Назвіть потрібний метод.
Перший проект:
class FirstClass()
{
public string Name()
{
return "James";
}
}
Тут додайте посилання на Другий проект
Другий проект:
class SeccondClass
{
FirstProject.FirstClass obj=new FirstProject.FirstClass();
obj.Name();
}
У проекті P1 зробіть клас загальнодоступним (якщо його ще немає). Потім додайте посилання на проект (а не посилання на файл, помилка, з якою я стикався періодично) до P2. Додайте користувальницький оператор у P2 у потрібному місці та почніть використовувати клас з P1.
(Якщо згадати про це: Альтернативою для того, щоб оприлюднити клас, було б зробити P2 другом P1. Це, однак, навряд чи буде вашою відповіддю, оскільки це матиме певні наслідки. Тому дотримуйтесь наведеної вище пропозиції.)
Скажімо, ваш клас у проекті 2 називається MyClass.
Очевидно, спочатку посилайтесь на свій проект 2 під посиланнями в проекті 1
using namespaceOfProject2;
// for the class calling bit:
namespaceOfProject2.MyClass project2Class = new namespaceOfProject2.MyClass();
тому коли ви хочете посилатися на цей клас, ви вводите project2Class. Плюс також переконайтеся, що і клас загальнодоступний.
У мене виникла проблема з різними цільовими рамками.
Я все робив правильно, але просто не міг використати посилання в P2. Після того, як я встановив однакові цільові рамки для P1 та P2, це спрацювало як шарм.
Сподіваюся, це комусь допоможе
The name ... does not exist in the current context. Cannot resolve symbol ...поки я не змінив цільові рамки проектів на відповідність. (Клацніть правою кнопкою миші проект і перейти до Project -> Properties -> Target frameworkзмінити це.)