2009-03-02 15 views
46

¿Me pregunto si hay alguna heurística para cuándo establecer copy-local=true para las referencias?¿Cuándo se debería establecer copy-local en verdadero y cuándo no?

Si los tipos de referencia sólo se utilizan internamente puedo configurar copy-local a true pero si los tipos de referencia se exponen como parámetros o valores que puse copy-local a false e indican que una versión específica de la dependencia debe ser referenciado cuando mi biblioteca debe ser de vuelta ¿usado?

¿Alguien puede aclarar esto para mí?

Respuesta

2

Esta opción solo afecta a la fase de construcción. Simplemente copia la referencia al directorio local del ensamblaje construido.

Si otro conjunto (T) desea utilizar un método del conjunto que está construyendo (A) que tiene tipo de retorno o parámetros de otro conjunto referenciado (R), (T) debería poder acceder a ese conjunto (R). Podría ser capaz de hacerlo sin hacer nada especial si el ensamblaje al que se hace referencia (R) está instalado en GAC. De lo contrario, necesita una copia local de eso.

+3

Hace un poco más que eso. Afecta mucho a los escenarios de implementación. – JaredPar

+0

Creo que no afecta la compilación, excepto un simple proceso de copia de archivo. Por favor corrígeme si no es verdad. –

+0

@Mehrad, afectará a los escenarios de compilación, pero al menos igualmente dirigido a la implementación. – JaredPar

41

La copia local es importante para escenarios de implementación y herramientas. Como regla general, debe usar CopyLocal = True si la referencia no está contenida dentro del GAC.

Copiar local esencialmente significa que debo implementar manualmente esta DLL para que mi aplicación funcione. Cuando es falso, básicamente significa "dependo de otro componente que debe instalarse por separado o encadenado, el archivo DLL ya estará allí".

+1

Qué tal si tengo una biblioteca de utilidades MyUtils que usa LibX (no en gac) internamente y no expone ningún tipo específico de LibX. Allí establecería copy-local en true. Sin embargo, si expongo tipos de LibX de MyUtils, tendría que ref. LibX también de ProjectA que usa MyUtils no? – Fadeproof

+0

¿Debo en ese caso establecer copy-local en falso ya que tendría que ref LibX así como MyUtils de ProjectA? – Fadeproof

10

Realmente se trata del entorno de destino. Si copy local es falso, está diciendo que el ensamblado ya existirá en el entorno de destino (normalmente en el GAC). Establecerlo en verdadero asegura que aparecerá en el resultado de su compilación, por lo que facilita la implementación en el entorno de destino.

6

Consulte la siguiente referencia de MSDN que explica el comportamiento de CopyLocal en detalle.

Project References

Desafortunadamente hay algunas peculiaridades y CopyLocal trabajará no es necesario como se esperaba para las referencias de montaje en conjuntos secundarios estructurado como se muestra a continuación.

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll (si en la GAC ​​CopyLocal no copiará a la carpeta bin MainApp)

Esto hace que las implementaciones de xcopy sean difíciles si no lo hace y al instalar el ensamblaje de terceros en el GAC en la máquina de destino.

11

La copia local se implementó realmente para admitir la depuración local. Cuando desarrolle su aplicación para el paquete y la implementación, debe construir sus proyectos en la misma carpeta de salida y asegurarse de que tiene todas las referencias que necesita allí.

CopyLocal es especialmente molesto cuando se construyen árboles fuente grandes.Hubo una pregunta relacionada sobre cómo deshabilitar CopyLocal aquí en SO se puede ver en How do I override CopyLocal (Private) setting for references in .NET from MSBUILD. Además de Best practices for large solutions in Visual Studio (2008).

He escrito sobre cómo tratar con la construcción de grandes árboles fuente en el artículo MSBuild: Best Practices For Creating Reliable Builds, Part 2.

Así que, en pocas palabras, deshabilitar CopyLocal cuando la copia de archivos está causando que sus compilaciones tomen más tiempo de lo que está dispuesto a gastar para cada compilación.

+3

¿Sería mejor decir "desactivar CopyLocal SOLAMENTE cuando cambie la salida para construir sus proyectos en la misma carpeta de salida y asegúrese de tener todas las referencias que necesita allí"? –

+0

@MichaelFreidgeim: ¿Encontró una respuesta a su pregunta? – davenewza

0

Manera conservadora de configurar CopyLocal falso es comprobar que la referencia se encuentra en la ruta de salida del proyecto. Esto debería permitirle esquivar algunos desagradables problemas de tiempo de ejecución, al mismo tiempo que reduce la cantidad de IO.

En el proceso creé CopyLocalFixer, que puede ejecutar para una carpeta. Intenté esto con una compilación grande, pero los resultados no fueron tan impresionantes para ser honestos. Supongo que se trata de la estructura de carpetas del proyecto.

Cuestiones relacionadas