Como usar uma classe de um projeto C # com outro projeto C #

110

Na mesma solução, tenho dois projetos: P1 e P2. Como posso fazer uso de uma classe de P1 em P2?

Strider007
fonte
Pergunta muito semelhante aqui
RBT

Respostas:

65

Basta adicionar referência a P1 de P2

Nissim
fonte
12
Isso não funcionará se a classe não for pública ou se P2 for amigo de P1.
Manfred
7
Neste caso, você tem 3 opções: 1) Combinar os 2 projetos 2) Tornar a classe interna - e adicionar P2 como atributo "InternalsVisibleTo" (mais informações aqui: msdn.microsoft.com/en-us/library/… ). 3) Se nenhum dos itens acima puder ser feito - você terá que usar reflexão para instanciar e invocar a classe P1 de P2
Nissim
21
Eu teria preferido uma resposta mais elaborada. Este parece quase sarcástico.
shteeven
5
Um exemplo teria sido melhor.
Paul Alexander
1
Além disso, os dois projetos precisam ter como alvo a mesma estrutura .NET. Verifique as propriedades de cada projeto na guia 'Aplicativo', deve haver uma 'Estrutura de destino'. Ambos os projetos precisam ter como alvo a mesma estrutura aqui.
Travis
192
  1. Na árvore 'Solution Explorer', expanda o projeto P2 e, a seguir, clique com o botão direito do mouse no projeto e selecione 'Add Reference' no menu.
  2. Na caixa de diálogo 'Adicionar Referência', selecione a guia 'Projetos' e selecione seu projeto P1.
  3. Se estiver usando namespaces, você precisará importar os namespaces para seus tipos P1 adicionando instruções 'using' a seus arquivos em P2.

Observe que os tipos em P1 que você deseja acessar diretamente devem ter um nível de acesso suficiente: normalmente, isso significa que eles devem ser tornados públicos.

Paul Ruane
fonte
Excelente conselho, senhor. Eu costumava colar links, mas precisava atualizá-los sempre que alterava o caminho de um arquivo. Com uma referência de projeto, tudo é muito mais fácil. Obrigado!
IneedHelp de
2
E se você já tiver uma referência a P2 em P1? Fazer o acima criaria uma "dependência circular" ...
colmde de
4
@colmde sim, seria. Você teria que abstrair os elementos que deseja compartilhar em um terceiro projeto, que você poderia chamar imaginativamente de P3, que é referenciado pelos outros dois projetos.
Paul Ruane
Como um desenvolvedor não-NET, eu realmente acho que esta deve ser a resposta aceita ... Obrigado Paul (x2)
thisIsTheFoxe
16

Paul Ruane está correto, eu acabei de tentar construir o projeto sozinho. Acabei de fazer um SLN inteiro para testar se funcionou.

Eu fiz isso no VC # VS2008

<< (Apenas ajudando outras pessoas que lêem isto também com () comentários)

Passo 1:

Faça uma solução chamada DoubleProject

Passo 2:

Faça o projeto na solução chamada DoubleProjectTwo (para fazer isso, selecione o arquivo de solução, clique com o botão direito -> Adicionar -> Novo Projeto)

Agora tenho dois projetos na mesma solução

Etapa 3:

Como Paul Ruane afirmou. vá para as referências no explorador de soluções (se fechado, está na guia de visualização do compilador). DoubleProjectTwo é aquele que precisa de funções / métodos de DoubleProject, portanto, em DoubleProjectTwo, faça a referência do mouse direito lá -> Adicionar -> Projetos -> DoubleProject.

Passo 4:

Inclua a diretiva para o namespace:

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();
        }
    }
}

Passo 5:

Faça algo me mostrar a prova dos resultados:

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;
        }
    }
}

O principal

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();
        }
    }
}

Isso DEVE resolver

Espero que isto ajude

EDIT ::: whoops esqueceu a chamada do método para realmente alterar a string, não faça o mesmo :)

Proclyon
fonte
9

Com muita frequência, um novo desenvolvedor faz esta pergunta simples, que é um problema comum especificamente com IDE do Visual Studio. Poucas pessoas respondem à pergunta específica e freqüentemente a criticam ou dão "palpites" para soluções que não respondem aos problemas comuns. O primeiro problema comum é que o IDE leva você a criar novos projetos em vez de adicionar novos arquivos (.java, .py, .cpp, .c) à solução existente (por padrão, ele cria uma nova solução) a menos que você altere o nome do projeto e adicionar à solução atual. Esse problema ocorre para pastas de projeto Python, java, c #, C ++ e C.

Isso não acontece quando você adiciona outro projeto usando os comandos new> project> project type do IDE. O problema aqui é que o novo projeto está armazenado em um diretório diferente dos arquivos de código do cliente ou da interface do usuário existentes. Para criar um novo "arquivo" no mesmo espaço de projeto em vez de um novo projeto, o iniciante precisa fazer o seguinte que a Microsoft não fará por você e até mesmo o desvia do óbvio intuitivo por padrão.

  1. Selecione o "aplicativo" para o qual deseja importar o novo comportamento (de outro arquivo)
  2. Selecione o projeto> adicionar novo item
  3. Selecione o "tipo de modelo de arquivo de programa", como filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C #, etc. ou um tipo de arquivo de classe de biblioteca (algo diferente das opções de arquivo de inicialização que você vê ao criar um novo projeto de aplicativo ou crie um novo projeto de biblioteca).
  4. Um novo nome de arquivo com nome padrão é criado em seu projeto.
  5. Altere o nome padrão do arquivo para algo como library.py ou façade.java, etc.

AGORA, as recomendações de código para importar bibliotecas ou usar namespaces funcionarão conforme descrito nos comentários acima e você não precisa alterar instruções de caminho ou alterar caminhos de soluções e nomes de soluções que a Microsoft não permitirá que você altere facilmente (ou seja, você pode alterar o nomes de arquivos ou nomes de projetos, mas o IDE não mudará automaticamente o caminho do projeto ou os nomes dos caminhos da solução).

A seguir está um exemplo de Python, mas funciona de maneira semelhante para C #, java ou C / C ++ usando os includes, namespaces ou usando comandos de código apropriados para cada linguagem para localizar código em outras classes / projetos no MESMO ESPAÇO DE DIRETÓRIO.

O arquivo do aplicativo "hello world" importando de outros arquivos de código no mesmo diretório.

Observe que os delimitadores de espaço em branco do Python não vão espaçar corretamente neste editor de comentários 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

O arquivo de biblioteca ou arquivo "façade" contendo classes, métodos ou funções que você deseja importar.

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

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

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


pass

AGORA, como você realmente resolve a bagunça para a qual o IDE o leva? Para importar código de outro arquivo no mesmo espaço de diretório, você adiciona uma referência a ele.

  1. Selecione o arquivo do aplicativo
  2. Selecione Projeto> adicionar referência
  3. Escolha o nome do arquivo visível com o caminho do diretório correto (marque-o)
  4. A referência agora está disponível para o intérprete, o verificador de código e / ou o compilador.

OK, agora que você tem esse problema resolvido, como você realmente vincula dois projetos separados no mesmo espaço de solução?

  1. Você tem que ir para as opções indexador ou "intellisense" e o compilador / interpretador e verificar fisicamente ou alterar / adicionar as instruções do caminho do diretório se elas forem algo diferente do que aponta para o seu "segundo" projeto ou espaço de solução. Quando você faz as mudanças de caminho ou altera as variáveis ​​de caminho para seu espaço de trabalho e para os locais específicos dos projetos que são espaços de diretório diferentes, o compilador e o analisador de código podem então encontrar essas bibliotecas, headers.h, namespaces, locais de projeto ou arquivo.
  2. Remover projetos antigos que você criou por engano é ainda pior. Você tem que sair do IDE do Visual Studio, abrir o windows explorer, ir para o diretório do espaço de trabalho ... documentos \ visualstudio xxx \ nome da solução \ nome do pacote selecione o arquivo ou pasta, clique com o botão direito e "delete" arquivo ou pasta.
  3. Quando você entra novamente no IDE e seleciona solução aberta ou pacote / solução aberta, os arquivos e nomes de solução / pacote antigos desaparecem, assim como suas declarações de caminho enganosas que enganam o compilador e o analisador de código para olhar para o diretório antigo mesmo que você tenha alterado o nome do arquivo e mudou o nome do projeto, ele não muda o caminho do diretório com ele.

A Microsoft realmente precisa corrigir esses problemas para que você possa criar intuitivamente o que a maioria das pessoas deseja criar como novos arquivos nos mesmos diretórios e remover soluções selecionando-as e excluindo-as do IDE. Iniciantes ficam tão frustrados com as declarações de caminho de diretório tão flexíveis para desenvolvedores experientes, mas tão injustas para novos desenvolvedores em seus padrões.

Espero que isso realmente ajude vocês, novatos, e impeça desenvolvedores experientes de dar respostas erradas que não funcionam para vocês. Eles presumem que você já entende as instruções de caminho e apenas deseja digitar o código certo ... que é também o motivo do túnel tentar corrigir seu código, mas não o ajuda a corrigir o problema. Este é provavelmente o problema mais comum continuamente descrito no stackoverflow com respostas erradas que não funcionam para novos programadores.

mwh
fonte
Para resumir esta resposta (para o VS 2017): clique com o botão direito em P1 no explorador de soluções >>> adicionar ... >>> referência ... >>> Projetos >>> Solução >>> Marque a caixa de seleção P2.
andrew pate
7

O primeiro passo é fazer P2 referência P1 fazendo o seguinte

  • Clique com o botão direito no projeto e selecione "Adicionar Referência"
  • Vá para a guia Projetos
  • Selecione P1 e clique em OK

Em seguida, você precisa se certificar de que as classes em P1 são acessíveis para P2. A maneira mais fácil é fazê-los public.

public class MyType { ... }

Agora você deve ser capaz de usá-los no P2 por meio de seu nome totalmente qualificado. Supondo que o namespace de P1 seja Projeto1, o seguinte funcionaria

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

A forma preferida, porém, é adicionar um usando para Project1para que você possa usar os tipos sem qualificação

using Project1;
...

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

Se você tiver dois projetos em uma pasta de solução. Basta adicionar a Referência do Projeto em outra. Usando o Namespace, você pode obter as classes. Ao criar o objeto para essa classe exigida. Chame o método que você deseja.

FirstProject:

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

Adicione aqui referência ao Segundo Projeto

SecondProject:

class SeccondClass
{
    FirstProject.FirstClass obj=new FirstProject.FirstClass();
    obj.Name();
}
Hemant Kumar
fonte
4

No projeto P1 torne a classe pública (se já não estiver). Em seguida, adicione uma referência de projeto (em vez de uma referência de arquivo, um erro que encontrei ocasionalmente) em P2. Adicione uma instrução using em P2 no local correto e comece a usar a classe de P1.

(Para mencionar isso: a alternativa para tornar a aula pública seria tornar P2 um amigo de P1. Esta é, no entanto, improvável que seja a resposta que você está procurando, pois teria algumas consequências. Portanto, continue com a sugestão acima.)

Manfred
fonte
2

Digamos que sua classe no projeto 2 se chame MyClass.

Obviamente, primeiro referencie seu projeto 2 nas referências no projeto 1, então

using namespaceOfProject2;

// for the class calling bit:

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

portanto, sempre que quiser fazer referência a essa classe, digite project2Class. Além disso, certifique-se de que a aula seja pública também.

Connor
fonte
1

Tive um problema com diferentes estruturas de destino.

Eu estava fazendo tudo certo, mas simplesmente não conseguia usar a referência em P2. Depois de definir a mesma estrutura de destino para P1 e P2, funcionou perfeitamente.

Espero que ajude alguém

Vitalie Belinschi
fonte
Eu tive o mesmo problema, com erros como The name ... does not exist in the current context. Cannot resolve symbol ...até que eu alterasse as estruturas de destino dos projetos para corresponder. (Clique com o botão direito do mouse no projeto e vá para Project -> Properties -> Target frameworkpara alterar isso.)
sonny