En la misma solución, tengo dos proyectos: P1 y P2. ¿Cómo puedo hacer uso de una clase de P1 en P2?
fuente
En la misma solución, tengo dos proyectos: P1 y P2. ¿Cómo puedo hacer uso de una clase de P1 en P2?
Simplemente agregue una referencia a P1 desde 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 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 :)
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.
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.
Bien, ahora que tiene este problema resuelto, ¿cómo puede realmente vincular dos proyectos separados en el mismo espacio de solución?
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.
El primer paso es hacer P2 referencia P1 haciendo lo siguiente
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 Project1
que pueda usar los tipos sin calificación
using Project1;
...
public void Example() {
MyType obj = new MyType();
}
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();
}
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).
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.
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
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 framework
para cambiar esto.)