Cómo usar una clase de un proyecto de C # con otro proyecto de C #

110

En la misma solución, tengo dos proyectos: P1 y P2. ¿Cómo puedo hacer uso de una clase de P1 en P2?

Strider007
fuente
Pregunta muy similar aquí
RBT

Respuestas:

65

Simplemente agregue una referencia a P1 desde P2

Nissim
fuente
12
Esto no funcionará si la clase no es pública o si P2 es amigo de P1.
Manfred
7
En este caso tiene 3 opciones: 1) Combinar los 2 proyectos 2) Hacer la clase interna - y agregar P2 como atributo "InternalsVisibleTo" (más información aquí: msdn.microsoft.com/en-us/library/… ). 3) Si no se puede hacer nada de lo anterior, tendrá que usar la reflexión para instanciar e invocar la clase P1 de P2
Nissim
21
Hubiera preferido una respuesta más elaborada. Este se siente casi sarcástico.
sábado
5
Un ejemplo hubiera sido mejor.
Paul Alexander
1
Además, ambos proyectos deben tener como objetivo el mismo marco .NET. Verifique las propiedades de cada proyecto en la pestaña 'Aplicación'; debe haber un 'Marco de destino'. Ambos proyectos deben apuntar al mismo marco aquí.
Travis
193
  1. En el árbol 'Explorador de soluciones', expanda el proyecto P2 y luego haga clic con el botón derecho en el proyecto y seleccione 'Agregar referencia' en el menú.
  2. En el cuadro de diálogo 'Agregar referencia', seleccione la pestaña 'Proyectos' y seleccione su proyecto P1.
  3. Si está utilizando espacios de nombres, deberá importar los espacios de nombres para sus tipos P1 agregando declaraciones 'usando' a sus archivos en P2.

Tenga en cuenta que los tipos en P1 a los que desea acceder directamente deben tener un nivel de acceso suficiente: por lo general, esto significa que deben hacerse públicos.

Paul Ruane
fuente
Excelente consejo, señor. Solía ​​pegar enlaces, pero luego tenía que actualizarlos cada vez que cambiaba la ruta de un archivo. Con una referencia de proyecto, todo es mucho más fácil. ¡Gracias!
IneedHelp
2
¿Qué pasa si ya tiene una referencia a P2 en P1? Hacer lo anterior crearía una "dependencia circular" ...
colmde
4
@colmde sí lo haría. Tendría que abstraer los elementos que desea compartir en un tercer proyecto, que podría llamar imaginativamente P3, al que hacen referencia los otros dos proyectos.
Paul Ruane
Como desarrollador no NET, realmente creo que esta debería ser la respuesta aceptada ... Gracias Paul (x2)
thisIsTheFoxe
16

Paul Ruane tiene razón, acabo de intentar construir el proyecto. Acabo de hacer un SLN completo para probar si funcionaba.

Hice esto en VC # VS2008

<< (Solo ayudando a otras personas que lean esto también con () comentarios)

Paso 1:

Hacer una solución llamada DoubleProject

Paso 2:

Haga un proyecto en la solución llamada DoubleProjectTwo (para hacer esto, seleccione el archivo de la solución, haga clic con el botón derecho -> Agregar -> Nuevo proyecto)

Ahora tengo dos proyectos en la misma solución.

Paso 3:

Como dijo Paul Ruane. vaya a las referencias en el explorador de soluciones (si está cerrado, está en la pestaña de vista del compilador). DoubleProjectTwo es el que necesita funciones / métodos de DoubleProject, por lo que en DoubleProjectTwo la referencia del mouse derecho allí -> Agregar -> Proyectos -> DoubleProject.

Paso 4:

Incluya la directiva para el espacio de nombres:

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

Paso 5:

Haz algo muéstrame prueba de 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;
        }
    }
}

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

Eso debería hacer el truco

Espero que esto ayude

EDITAR ::: olvidé la llamada al método para cambiar realmente la cadena, no hagas lo mismo :)

Proclyon
fuente
9

Con demasiada frecuencia, un nuevo desarrollador hace esta simple pregunta, que es un problema común específicamente con los IDE de Visual Studio. Pocas personas responden a la pregunta específica ya menudo critican la pregunta o dan "suposiciones" para soluciones que no responden a los problemas comunes. El primer problema común es que el IDE lo lleva a crear nuevos proyectos en lugar de agregar nuevos archivos (.java, .py, .cpp, .c) a la solución existente (de manera predeterminada crea una nueva solución) a menos que cambie el nombre del proyecto y agregar a la solución actual. Este problema ocurre para las carpetas de proyectos de Python, java, c #, C ++ y C.

Esto no sucede cuando agrega otro proyecto usando los nuevos> proyectos> comandos de tipo de proyecto del IDE. El problema aquí es que el nuevo proyecto está almacenado en un directorio diferente al de los archivos de código de interfaz de usuario o cliente existentes. Para crear un nuevo "archivo" en el mismo espacio del proyecto en lugar de un nuevo proyecto, el principiante debe hacer lo siguiente que Microsoft no hará por usted e incluso lo desviará de lo intuitivamente obvio por defecto.

  1. Seleccione la "aplicación" a la que desea importar el nuevo comportamiento (desde otro archivo)
  2. Seleccionar proyecto> agregar nuevo elemento
  3. Seleccione el "tipo de plantilla de archivo de programa", como filetype.py, filetype.java, filetype.c, filetype.cpp, filetype.C #, etc. o un tipo de archivo de clase de biblioteca (algo diferente a las opciones de archivo de inicio que ve cuando crea un nuevo proyecto de aplicación o crear un nuevo proyecto de biblioteca).
  4. Se crea un nuevo nombre de archivo con el nombre predeterminado en su proyecto.
  5. Cambie el nombre predeterminado del archivo a algo como library.py o façade.java, etc.

AHORA, las recomendaciones de código para importar bibliotecas o usar espacios de nombres funcionarán como se describe en los comentarios anteriores y no tiene que cambiar las instrucciones de ruta o cambiar las rutas de las soluciones y los nombres de las soluciones que Microsoft no le permitirá cambiar fácilmente (es decir, puede cambiar el nombres de archivos o nombres de proyectos, pero el IDE no cambiará automáticamente la ruta del proyecto o los nombres de la ruta de la solución).

El siguiente es un ejemplo de Python, pero funciona de manera similar para C #, java o C / C ++ usando los espacios de nombres, las inclusiones o los comandos de código apropiados para cada lenguaje para encontrar código en otras clases / proyectos en el MISMO ESPACIO DE DIRECTORIO.

El archivo de la aplicación "hola mundo" se importa desde otros archivos de código en el mismo directorio.

Tenga en cuenta que los delimitadores de espacios en blanco de Python no se van a espaciar correctamente en este editor de comentarios de 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

El archivo de biblioteca o archivo de "fachada" que contiene las clases, métodos o funciones que desea importar.

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

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

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


pass

AHORA, ¿cómo resuelves realmente el lío al que te lleva el IDE? Para importar código de otro archivo en el mismo espacio de directorio, agregue una referencia.

  1. Seleccione el archivo de la aplicación
  2. Seleccione Proyecto> agregar referencia
  3. Elija el nombre de archivo visible con la ruta de directorio correcta (márquelo)
  4. La referencia ahora está disponible para el intérprete, el verificador de código y / o el compilador.

Bien, ahora que tiene este problema resuelto, ¿cómo puede realmente vincular dos proyectos separados en el mismo espacio de solución?

  1. Tiene que ir a las opciones del indexador o "intellisense" y al compilador / intérprete y verificar físicamente o cambiar / agregar las instrucciones de la ruta del directorio si son algo diferente a lo que apunta a su "segundo" proyecto o espacio de solución. Cuando realiza cambios en la ruta o cambia las variables de ruta a su espacio de trabajo y a las ubicaciones específicas de los proyectos que son espacios de directorio diferentes, el compilador y el analizador de código pueden encontrar estas bibliotecas, headers.h, espacios de nombres, ubicaciones de proyectos o archivos.
  2. Eliminar proyectos antiguos que creó por error es aún peor. Debe salir del IDE de Visual Studio, abrir el explorador de Windows, ir al directorio del espacio de trabajo ... documentos \ visualstudio xxx \ solutionname \ packagename, seleccionar el archivo o carpeta, hacer clic derecho y "eliminar" el archivo o carpeta.
  3. Cuando vuelve a ingresar al IDE y selecciona la solución abierta o el paquete / solución abierto, los archivos antiguos y los nombres de la solución / paquete desaparecen, al igual que sus declaraciones de ruta engañosas, lo que engaña al compilador y al analizador de código para que miren el directorio antiguo aunque haya cambiado el nombre del archivo y cambió el nombre del proyecto, no cambia la ruta del directorio con él.

Microsoft realmente necesita solucionar estos problemas para que pueda crear intuitivamente lo que la mayoría de la gente quiere crear como archivos nuevos en los mismos directorios y eliminar soluciones seleccionándolas y eliminándolas del IDE. Los principiantes se sienten tan frustrados con las declaraciones de ruta de directorio tan flexibles para los desarrolladores experimentados, pero tan injustas para los nuevos desarrolladores en sus valores predeterminados.

Espero que esto realmente les ayude a los nuevos y evite que los desarrolladores experimentados le den las respuestas incorrectas que no funcionan para usted. Asumen que ya entiende las declaraciones de ruta y solo quiere escribir el código correcto ... que también es la razón por la que el túnel intenta corregir su código pero no lo ayuda a solucionar el problema. Este es probablemente el problema más común que se describe continuamente en stackoverflow con respuestas incorrectas que no funcionan para los nuevos programadores.

mwh
fuente
Para resumir esta respuesta (para VS 2017): haga clic con el botón derecho en P1 en el explorador de soluciones >>> agregar ... >>> referencia ... >>> Proyectos >>> Solución >>> Marque la casilla de verificación P2.
Andrew Pate
7

El primer paso es hacer P2 referencia P1 haciendo lo siguiente

  • Haga clic derecho en el proyecto y seleccione "Agregar referencia"
  • Vaya a la pestaña Proyectos
  • Seleccione P1 y presione OK

A continuación, deberá asegurarse de que las clases en P1 sean accesibles para P2. La forma más sencilla es hacerlos public.

public class MyType { ... }

Ahora debería poder usarlos en P2 a través de su nombre completo. Suponiendo que el espacio de nombres de P1 es Project1, lo siguiente funcionaría

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

Sin embargo, la forma preferida es agregar un uso para Project1que pueda usar los tipos sin calificación

using Project1;
...

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

Si tiene dos proyectos en una carpeta de solución, simplemente agregue la Referencia del Proyecto en otra. Usando el Espacio de Nombres puede obtener las clases. Al crear el objeto para eso, la clase requerida. Llame al método que desee.

Primer proyecto:

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

Añada aquí una referencia al Segundo Proyecto.

Segundo proyecto:

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

En el proyecto P1, haga pública la clase (si aún no lo está). Luego agregue una referencia de proyecto (en lugar de una referencia de archivo, un error con el que me he encontrado ocasionalmente) a P2. Agregue una instrucción using en P2 en el lugar correcto y comience a usar la clase de P1.

(Para mencionar esto: la alternativa a hacer pública la clase sería hacer de P2 un amigo de P1. Sin embargo, es poco probable que esta sea la respuesta que está buscando, ya que tendría algunas consecuencias. Por lo tanto, siga la sugerencia anterior).

Manfred
fuente
2

Digamos que su clase en el proyecto 2 se llama MyClass.

Obviamente, primero haga referencia a su proyecto 2 en las referencias en el proyecto 1 y luego

using namespaceOfProject2;

// for the class calling bit:

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

así que cuando quiera hacer referencia a esa clase, escriba project2Class. Además, asegúrese de que la clase también sea pública.

Connor
fuente
1

Tuve un problema con diferentes marcos de destino.

Estaba haciendo todo bien, pero no podía usar la referencia en P2. Después de establecer el mismo marco de destino para P1 y P2, funcionó a la perfección.

Espero que ayude a alguien

Vitalie Belinschi
fuente
Tuve el mismo problema, con errores como The name ... does not exist in the current context. Cannot resolve symbol ...hasta que cambié los marcos de destino de los proyectos para que coincidieran. (Haga clic con el botón derecho en el proyecto y vaya a Project -> Properties -> Target frameworkpara cambiar esto.)
sonny