Как использовать класс из одного проекта C # с другим проектом C #

110

В том же решении у меня есть два проекта: P1 и P2. Как я могу использовать класс P1 в P2?

Strider007
источник
Очень похожий вопрос здесь
RBT

Ответы:

65

Просто добавьте ссылку на P1 из P2

Ниссим
источник
12
Это не сработает, если класс не является общедоступным или если P2 является другом P1.
Manfred
7
В этом случае у вас есть 3 варианта: 1) Объединить 2 проекта 2) Сделать класс внутренним и добавить P2 в качестве атрибута «InternalsVisibleTo» (дополнительная информация здесь: msdn.microsoft.com/en-us/library/… ). 3) Если ничего из вышеперечисленного сделать нельзя - вам придется использовать отражение для мгновенного создания и вызова класса P1 из P2
Ниссим
21
Я бы предпочел более подробный ответ. Это почти саркастично.
shteeven
5
Пример был бы лучше.
Paul Alexander
1
Кроме того, оба проекта должны быть ориентированы на одну и ту же платформу .NET. Проверьте свойства каждого проекта на вкладке «Приложение», там должна быть «Целевая платформа». Оба проекта должны быть ориентированы на одну и ту же структуру.
Трэвис
195
  1. В дереве «Обозреватель решений» разверните проект P2, затем щелкните проект правой кнопкой мыши и выберите в меню «Добавить ссылку».
  2. В диалоговом окне «Добавить ссылку» выберите вкладку «Проекты» и выберите свой проект P1.
  3. Если вы используете пространства имен, вам нужно будет импортировать пространства имен для ваших типов P1, добавив операторы using к вашим файлам в P2.

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

Пол Руан
источник
Отличный совет, сэр. Раньше я вставлял ссылки, но потом мне приходилось обновлять их каждый раз, когда я менял путь к файлу. Со ссылкой на проект все намного проще. Спасибо!
IneedHelp
2
Что делать, если у вас уже есть ссылка на P2 в P1? Выполнение вышеизложенного создаст "круговую зависимость" ...
colmde
4
@colmde, да, будет. Вам придется абстрагироваться от элементов, которыми вы хотите поделиться, в третьем проекте, который вы можете образно назвать P3, на который ссылаются два других проекта.
Пол Руан
Как не-NET-разработчик, я действительно думаю, что это должен быть принятый ответ ... Спасибо, Пол (x2)
thisIsTheFoxe
16

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

Я сделал это в ВК # VS2008

<< (Просто помогать другим людям, которые читают это, с помощью () комментариев)

Шаг 1:

Сделайте решение под названием DoubleProject

Шаг 2:

Сделайте проект в решении с именем 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();
        }
    }
}

Это должно делать свое дело

Надеюсь это поможет

РЕДАКТИРОВАТЬ ::: упс забыл вызов метода, чтобы фактически изменить строку, не делайте того же :)

Проклион
источник
9

Слишком часто новый разработчик задает этот простой вопрос, который является распространенной проблемой именно в среде разработки Visual Studio. Мало кто отвечает на конкретный вопрос и часто критикует вопрос или дает «догадки» о решениях, которые не отвечают на общие проблемы. Первая распространенная проблема заключается в том, что среда IDE заставляет вас создавать новые проекты, а не добавлять новые файлы (.java, .py, .cpp, .c) к существующему решению (по умолчанию создается новое решение), если вы не измените имя проекта. и добавить к текущему решению. Эта проблема возникает для папок проектов Python, java, C #, C ++ и C.

Этого не происходит, когда вы добавляете другой проект с помощью команд среды IDE new> project> project type. Проблема здесь в том, что новый проект хранится в другом каталоге, чем существующие файлы кода клиентского или пользовательского интерфейса. Чтобы создать новый «файл» в том же пространстве проекта, а не новый проект, новичок должен сделать следующее, чего 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 ++ с использованием включений, пространств имен или команд кода, соответствующих каждому языку, для поиска кода в других классах / проектах в ТАКОМ ПРОСТРАНСТВЕ КАТАЛОГА.

Файл приложения "hello world" импортируется из других файлов кода в том же каталоге.

Обратите внимание, что разделители пробелов python не будут правильно размещаться в этом редакторе комментариев 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. Еще хуже - удалить старые проекты, которые вы создали по ошибке. Вам нужно выйти из среды разработки Visual Studio, открыть проводник Windows, перейти в каталог рабочей области ... documents \ visualstudio xxx \ solutionname \ packagename, выбрать файл или папку, щелкнуть правой кнопкой мыши и «удалить» файл или папку.
  3. Когда вы повторно входите в среду IDE и выбираете открытое решение или открытый пакет / решение, старые файлы и имена решений / пакетов исчезают, как и их вводящие в заблуждение операторы пути, которые обманывают компилятор и анализатор кода, чтобы посмотреть на старый каталог, даже если вы изменили имя файла и изменилось имя проекта, путь к каталогу с ним не изменится.

Microsoft действительно, действительно необходимо решить эту проблему, чтобы вы могли интуитивно создавать то, что большинство людей хотят создать в виде новых файлов в тех же каталогах, и удалять решения, выбирая их и удаляя из среды 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();

Однако предпочтительный способ - добавить using для, 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. Добавьте оператор using в 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изменить это.)
Сынок