2009-06-12 9 views
6

Duplicar - esta pregunta exacta fue hecha here - la única solución parece ser el evento de compilación posterior.Estudio visual recursivo Copiar local

En Visual Studio 2008, tengo los siguientes proyectos:

  • A - B referencias

  • B - referencias Lib.dll

Cuando se construye B, Lib .dll aparece en B/bin/Debug. (esto está bien)

Cuando se genera A, B.dll aparece en A/bin/Debug, pero Lib.dll NO aparece en A/bin/Debug.

¿No sería lógico copiar también todas las dependencias de B a la ruta de salida de A, ya que B necesitará estos ensamblados en tiempo de ejecución?

Todas las referencias tienen copylocal = true.


(ahora tengo que hacer referencia a las dependencias de todos los de B de A con la mano, ¿es correcto? También podría usar un paso de generación supongo. De todos modos, no este comportamiento tiene alguna ventaja/sentido?)

+0

¿En qué versión vof visual studio estás trabajando? –

+0

Estoy usando VS 2008. Creo que se comporta de la misma manera en 2005/2010 también. –

+1

archivó un elemento en connect, fwiw: https://connect.microsoft.com/VisualStudio/feedback/details/694561/copy-local-private-true-private-on-a-project-reference-needs-to-also-copy-what-the-target-project-marks-as-copy- local –

Respuesta

5

Esto solo funciona si el ensamblado está realmente referenciado por el .dll. es decir, si tiene LibInterface.dll y LibImplementation.dll, y su código en A solo hace referencia a las clases en LibInterface.dll, no hay forma de obtener LibImplentation.dll en la salida para B (limpiamente).

Esto también se aplica a los archivos arbitrarios, es decir, si tiene Randon.myFile relacionado con el proyecto A, este sería el procedimiento deseado: 1. Agregar como copia local, o generar evento para el proyecto A (de modo que en salida para el proyecto A) 2. En el Proyecto B, configure "copiar local" en el proyecto A ref. 3. Debería obtener todo en el resultado del proyecto A en el proyecto B (incluido su archivo), pero no es así.

Podría haber alguna otra opción: "Copiar local, todo" o algo así. Esto ayudaría a VS a apoyar las técnicas de IOC y a limpiar las abstracciones.

0

He realizado el mismo procedimiento muchas veces y no es necesario volver a hacer referencia a los ensamblajes manualmente. Una forma fácil de probar esto es:

referencia B
  1. en A
  2. crear una instancia de un objeto de B en A.
  3. compilar.

Si la compilación se completa con éxito, todo se referencia OK.

+0

La compilación se completa con éxito, pero en tiempo de ejecución la instalación del objeto de B en A termina en la excepción "No se puede cargar el tipo o ensamblado", porque ese objeto de B usa objetos de Lib.dll, que no está ni en GAC ni en la carpeta actual . –

+0

... tienen el mismo problema, también. Parece que tiene algo que ver con la información de la versión, incluso si la versión específica está configurada como falsa – Beachwalker

0

Si Lib.dll es un dll de interoperacion, entonces su dll subyacente no se copiara. Aparte de eso, diría que probablemente haya un error del operador porque definitivamente no necesita hacer una referencia manual de los conjuntos administrados dependientes.

Cuestiones relacionadas