2010-08-24 242 views

Respuesta

54

sólo tiene que añadir referencia a P1 de P2

+7

Esto no funcionará si la clase no es pública o si P2 es amigo de P1. – Manfred

+6

En este caso, tiene 3 opciones: 1) Combine los 2 proyectos 2) Establezca la clase interna - y agregue P2 como atributo "InternalsVisibleTo" (más información aquí: http://msdn.microsoft.com/en-us /library/system.runtime.compilerservices.internalsvisibletoattribute.aspx). 3) Si no se puede hacer nada de lo anterior, deberá usar el reflejo para crear instancias e invocar la clase P1 desde P2 – Nissim

2

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

(Para mencionar esto: La alternativa para hacer que la clase sea pública sería hacer que P2 sea un amigo de P1. Sin embargo, es poco probable que sea la respuesta que se busca, ya que tendría algunas consecuencias. sugerencia anterior.)

137
  1. En el árbol 'Solution Explorer', expanda el proyecto P2 y luego haga clic 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, necesitará importar los espacios de nombres para sus tipos P1 agregando declaraciones 'using' a sus archivos en P2.

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

+0

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

+0

¿Qué sucede si ya tiene una referencia a P2 en P1? Hacer lo anterior crearía una "dependencia circular" ... – colmde

+4

@colmde sí lo haría. Debería abstraer los elementos que desea compartir en un tercer proyecto, que podría titular con imaginación P3, al que hacen referencia los otros dos proyectos. –

5

El primer paso es hacer referencia P2 P1 de la siguiente manera

  • Haga clic derecho en el proyecto y seleccione "Agregar referencia"
  • Ir a la ficha Proyectos
  • Seleccionar P1 y pulsa OK

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

public class MyType { ... } 

Ahora debería poder utilizarlos en P2 a través de su nombre completo. Suponiendo que el espacio de nombres de P1 es Proyecto1 entonces el siguiente funcionaría

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

La forma preferida aunque es añadir un utilizando para Project1 lo que puede utilizar los tipos sin calificación

using Project1; 
... 

public void Example() { 
    MyType obj = new MyType(); 
} 
0

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 ese la clase requerida. Llame al método que desee.

FirstProject:

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

Aquí Agregar referencia para el Segundo Proyecto

SecondProject:

class SeccondClass 
{ 
    FirstProject.FirstClass obj=new FirstProject.FirstClass(); 
    obj.Name(); 
} 
11

Paul Ruane es correcta, simplemente he tratado a mí mismo la construcción del proyecto. Acabo de hacer un SLN entero para probar si funcionó.

Hice esto en VC# VS2008

< < (Sólo ayudar a otras personas que lean este aswell con() comentarios)

Paso 1:

solución Hacer una llamada DoubleProject

Paso 2 :

Make Project en solución llamado DoubleProjectTwo (para hacer esto seleccione la s olución archivo, haga clic derecho -> Añadir -> Proyecto Nuevo)

ahora tengo dos proyectos en la misma solución

Paso 3:

Como se indicó Paul Ruane. vaya a las referencias en el explorador de soluciones (si está cerrado, está en la pestaña de visualización 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:

Incluir 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:

Hacer algo me mostrar 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; 
     } 
    } 
} 

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

que debería hacer el truco

Esperanza esto ayuda

EDIT ::: gritos olvidaron la llamada al método para cambiar realmente la cuerda , no hagas lo mismo :)

1

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

Obviamente, primera referencia de su proyecto 2, con los números en el proyecto 1, entonces

using namespaceOfProject2; 

// for the class calling bit: 

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

lo que cada vez que desea hacer referencia esa clase que escriba project2Class. Además, asegúrese de que la clase sea pública también.

3

Demasiado a menudo un nuevo desarrollador hace esta simple pregunta que es un problema común específicamente con Visual Studio IDE. Pocas personas responden la pregunta específica y a menudo critican la pregunta o dan "conjeturas" para soluciones que no responden a los problemas comunes. El primer problema común es que 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 se produce para las carpetas de proyectos Python, java, C#, C++ y C. El nuevo desarrollador seleccionando "nuevo> proyecto> nombre de proyecto y cambiando el directorio de solución para" usar la misma solución "crea un nuevo" proyecto "en el mismo espacio de solución, pero no en el mismo espacio de directorio que el usuario actual archivo de interfaz o archivo de línea de comando que aún genera problemas con los errores del "paquete no encontrado" al compilar y ejecutar el proyecto o solución. Por esta razón, las sugerencias de codificación anteriores para importar paquetes, clases, métodos y funciones solo funcionan (y por lo tanto no t responder a la pregunta) cuando el archivo "biblioteca" o el archivo "comportamiento separado" no solo está en la misma ruta del directorio de solución, sino también en el mismo espacio de directorio de la aplicación "interfaz de usuario" o "shell de comando". Esto no sucede cuando agrega otro proyecto usando los nuevos> project> tipo de proyecto comandos del IDE. El problema aquí es que el nuevo proyecto se almacena en un d diferente irectory que los archivos de código de la interfaz de usuario o usuario existentes. Para crear un nuevo "archivo" en el mismo espacio de 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" que desea importar el nuevo comportamiento en (desde otro archivo)
  2. seleccione 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 distinto de las opciones de archivo de inicio que ve cuando crea un nuevo proyecto de aplicación o crea un nuevo proyecto de biblioteca).
  4. Se crea un nuevo nombre de archivo con el nombre predeterminado en su proyecto.
  5. cambiar el nombre predeterminado del archivo a algo como library.py o façade.java, etc.

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

El siguiente es un ejemplo de Python pero funciona de forma similar para C#, java o C/C++ utilizando los espacios de nombre, espacios de nombres o comandos de código apropiados para encontrar código en otras clases/proyectos en SAME DIRECTORY SPACE.

El archivo de aplicación "hello world" importa de otros archivos de código en el mismo directorio.

Nota los delimitadores de espacio en blanco pitón no van al espacio correctamente en este editor de comentarios 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 "fachada" que contiene clases, métodos o funciones que desee 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 se soluciona realmente el lío al que te conduce el IDE? Para importar código de otro archivo en el mismo espacio de directorio, agregue una referencia al mismo.

  1. Seleccione el archivo de aplicación
  2. Seleccione Proyecto> añadir referencia
  3. Elija el nombre del archivo visible con la ruta del directorio derecha (comprobarlo)
  4. La referencia está ahora disponible para el intérprete, el corrector de código y/o el compilador

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

  1. Tienes que ir a las dos opciones "IntelliSense" paso a paso o el compilador/intérprete y comprobar físicamente o cambiar/añadir las sentencias de ruta de directorio si son algo distinto a lo que apunta a su proyecto de "segunda" o espacio de solución. Cuando lo haga la ruta cambia o cambia las variables de ruta a su área de trabajo y a las ubicaciones específicas de los proyectos que son diferentes espacios de directorio, el compilador y el analizador de código pueden encontrar estas bibliotecas, encabezados.h, espacios de nombres, ubicaciones de proyectos o archivos.
  2. Para eliminar proyectos antiguos que creó por error, es aún peor. Debe salir del Visual Studio IDE, abrir el explorador de Windows, ir al directorio del espacio de trabajo ... documents \ visualstudio xxx \ solutionname \ packagename seleccione el archivo o la carpeta, haga clic con el botón derecho y "elimine" el archivo o la carpeta.
  3. Cuando vuelve a introducir el IDE y selecciona abrir solución o abrir paquete/solución, los archivos antiguos y los nombres de solución/paquete desaparecen y sus declaraciones de ruta engañosas engañan al compilador y al analizador de código para que miren el directorio anterior incluso aunque cambió el nombre del archivo y cambió el nombre del proyecto, no cambia la ruta del directorio con él.

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

Espero que esto realmente te ayude a los chicos nuevos y evita que los experimentados desarrolladores te den las respuestas incorrectas que no te funcionan. Suponen que ya entiendes los enunciados de ruta y que solo quieres escribir el código correcto ... que es también la razón por la cual el túnel trata de corregir tu código pero no te 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.

+0

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

Cuestiones relacionadas