2008-11-26 20 views
44

Me pregunto qué hace copy-local = true para las referencias. ¿Copia el ensamblado al que se hace referencia junto con todas sus dependencias al directorio de salida?¿Cómo funciona Copy-local? log4net.dll no se está copiando al directorio de salida de MyProject

Mi situación es la siguiente: Tengo un contenedor de registro personalizado que utiliza log4net. Construyo un ensamblado de lanzamiento de MyLogWrapper.dll con el conjunto de referencia log4net.dll para copiar local verdadero. Hacer referencia a MyLogWrapper.dll desde MyProject con copy local set en true debería dar como resultado que log4net.dll se copiara también, ¿no? Solo estoy haciendo referencia a MyLogWrapper.dll y ninguna de sus dependencias en MyProject. log4net.dll no se está copiando al directorio de salida MyProject, pero sí a todas las demás dependencias de MyLogWrapper. ¿Cual podría ser el problema?

He hecho algunos experimentos más y parece que si quito el conjunto (log4net.dll) de GAC empieza a ser copiada localmente. ¿Alguien puede confirmar que este es el problema?

Respuesta

4

Cuando copia local se establece en true se copia todo el assemmbly cuyo atributo copia local = mar a la direcory bin de la aplicación.

En su caso, el archivo DLL puede ser que utilice el otro DLL por lo que requieren que también.

+8

... excepto los que están en GAC. – JustAMartin

+0

Incluso aquellos en GAC se copian con VS 2015 si el proyecto es referenciado por otro proyecto al otro directorio de salida del proyecto. Ver mi respuesta – vezenkov

5

Necesita ser un poco preocupado de copia local, ya que me ha atrapado en el pasado!

Sólo de vez en cuando, para un .dll particular, se fallará sin copiarlo a la carpeta de compilación. Por lo general, esto no aparece en una máquina de desarrollo, ya que las dll también suelen estar en el GAC (si ha instalado una herramienta/biblioteca de desarrollo que está utilizando para el desarrollo) y no se da cuenta hasta que se distribuye/se empaqueta en un instalador y los archivos necesarios faltan en una máquina cliente.

No hay mucha información sobre este error, pero esto demuestra que el hilo para una biblioteca en particular: here.

Habiendo quedado atrapado por esto, creo que es una buena idea (generalmente en cualquier caso) saber exactamente qué ensamblajes requiere su proyecto y tener un script o acción automatizada similar que garantice que todos los componentes necesarios estén presentes, ya sea cuando compila, o más probablemente cuando hace un instalador, o recopila archivos para su distribución,

+0

¿Recomiendas usar vs vs eventos de construcción para hacer esto? – Fadeproof

+0

No los he usado, así que no puedo decir sí o no. En el caso que tuve, tenía un script de NSIS que generaba el instalador para la herramienta que estaba escribiendo (una aplicación visual). En lugar de simplemente incluir * .dll en el instalador, lo actualicé para incluir cada ensamblado por nombre, de modo que me avisaron si faltaba alguno. – xan

+0

... cont. También obtuvo el ensamblaje correcto de otra parte si faltaba para que la generación del instalador no fallara, pero advirtió que VS no había copiado el .dll que necesitaba. – xan

10

Después de hacer esta pregunta en MSDN here - parece que este comportamiento es por diseño. "Si implementa/copia una aplicación que contiene una referencia a un componente personalizado que está registrado en el GAC, el componente no se implementará/copiará con la aplicación, independientemente de la configuración de Copiar local".

+0

VS 2015 hace una excepción a las referencias indirectas a través de una referencia de proyecto. Por ejemplo, VS 2010 no se comporta así. https://connect.microsoft.com/VisualStudio/Feedback/Details/1804765 – vezenkov

31

Desafortunadamente, parece que de acuerdo con la siguiente declaración tomada del MSDN documentation, la funcionalidad de CopyLocal no funciona como se esperaba para los ensamblados que ya están en el GAC.

Si despliega una aplicación que contiene una referencia a un componente personalizado que está registrado en el GAC, el componente no se implementará con la aplicación, independientemente de la configuración CopyLocal. En versiones anteriores de Visual Studio, podía establecer la propiedad CopyLocal en una referencia para asegurarse de que se implementó el ensamblado. Ahora, debe agregar manualmente el ensamblado a la carpeta \ Bin. Esto pone todo el código personalizado bajo escrutinio, reduciendo el riesgo de publicar código personalizado con el que no está familiarizado.

Más información se puede encontrar en la página siguiente que explica los detalles sobre cómo funcionan las referencias de proyecto.

MSDN: Project References

+0

He agregado un enlace a continuación a una publicación que realicé en DataDynamics ActiveReports para el foro .NET 3.0 con respecto a este mismo problema con respecto a dlls implementados con activos informes. Extrañamente, he descubierto que este supuesto comportamiento "por diseño" parece depender de que la biblioteca sea una referencia, por ejemplo, WPFToolkit.dll parece copiar en la carpeta bin, independientemente de si se trata de una referencia secundaria. http://www.datadynamics.com/forums/124306/ShowPost.aspx – jpierson

7

hay un truco: coloque la copia de referencia local en false y luego otra vez a la verdadera, y Visual Studio agrega los metadatos privada de forma automática para que la referencia. Al menos, VS 2010 lo hace. Hace poco hice esto para resolver un problema con nuestro servidor TFS Build, que por alguna razón extraña tenía muchos componentes de Enterprise Library instalados en el GAC, por lo que tuvimos problemas importantes al implementar nuestro proyecto desde la carpeta TFS Drop. Ese truco falso/verdadero nos salvó.

+1

No funciona en VS 2013. –

+0

Esto funcionó en mi máquina pero no en nuestro servidor de compilación. Parece que no puedo eliminar mi voto popular. – arkod

+0

Si no funciona en las ediciones más recientes de VS, entonces, supongo, no tenemos otra opción que modificar los archivos de proyecto manualmente para agregar "copiar local" a las referencias en el archivo XML del proyecto y luego tener mucho cuidado para evitar tocar configuración de referencia en Visual Studio en sí. Pero tendré que investigarlo más, tal vez incluso esta corrección manual no será suficiente si Microsoft ha cambiado el comportamiento del núcleo de msbuild desde VS 2010 ... – JustAMartin

0

He descubierto que esto no se respeta más en Visual Studio 2015 con referencias de proyectos si el proyecto al que se hace referencia tiene una dependencia a un ensamblado GAC. El ensamblado de GAC siempre se copia en la salida del proyecto raíz y se respeta la copia de local = false únicamente con respecto a la salida del proyecto que contiene la referencia al dll de GAC.

Connect feedback

Cuestiones relacionadas