¿Cuál es exactamente la diferencia entre HintPath
en un archivo .csproj y ReferencePath
en un .csproj.user
archivo? Estamos tratando de comprometernos con una convención donde las DLL de dependencia se encuentran en un repositorio svn de "versiones" y todos los proyectos apuntan a una versión en particular. Dado que los diferentes desarrolladores tienen diferentes estructuras de carpetas, las referencias relativas no funcionarán, por lo que se nos ocurrió un esquema para usar una variable de entorno que apunta a la carpeta de versiones del desarrollador en particular para crear una referencia absoluta. Entonces, después de agregar una referencia, editamos manualmente el archivo del proyecto para cambiar la referencia a una ruta absoluta usando la variable de entorno.
Me di cuenta de que esto se puede hacer tanto con el HintPath
como con el ReferencePath
, pero la única diferencia que pude encontrar entre ellos es que HintPath
se resuelve en el momento de la compilación y ReferencePath
cuando el proyecto se carga en el IDE. Sin embargo, no estoy seguro de cuáles son las ramificaciones de eso. He notado que VS a veces reescribe el .csproj.user
y tengo que reescribirlo ReferencePath
, pero no estoy seguro de qué lo desencadena.
Escuché que es mejor no registrar el .csproj.user
archivo ya que es específico del usuario, así que me gustaría apuntar a eso, pero también escuché que la HintPath
DLL especificada no está "garantizada" para ser cargada si la misma DLL se encuentra, por ejemplo, en el directorio de salida del proyecto. Tiene alguna idea sobre esto?
fuente
Busque en el archivo Microsoft.Common.targets
La respuesta a la pregunta está en el archivo
Microsoft.Common.targets
de la versión de su marco de destino.Para .Net Framework versión 4.0 (¡y 4.5!), El elemento AssemblySearchPaths se define así:
Para .Net Framework 3.5, la definición es la misma, pero el comentario es incorrecto. La definición 2.0 es ligeramente diferente, usa $ (OutputPath) en lugar de $ (OutDir).
En mi máquina tengo las siguientes versiones del archivo Microsoft.Common.targets:
Esto es con Visual Studio 2008, 2010 y 2013 instalados en Windows 7.
El hecho de que se busque en el directorio de salida puede ser un poco frustrante (como señala el póster original) porque puede ocultar una HintPath incorrecta. La solución se construye bien en su máquina local, pero se rompe cuando se construye en una estructura de carpetas limpia (por ejemplo, en la máquina de construcción).
fuente
Mi propia experiencia ha sido que es mejor ceñirse a uno de los dos tipos de referencias de ensamblaje:
He encontrado (al igual que ha descrito) otros métodos que se rompen con demasiada facilidad o tienen requisitos de mantenimiento molestos.
Cualquier ensamblado que no quiera para GAC, tiene que vivir en el directorio de ejecución. Cualquier ensamblado que no esté o no pueda estar en el directorio de ejecución I GAC (administrado por eventos de compilación automáticos).
Esto no me ha dado ningún problema hasta ahora. Si bien estoy seguro de que hay una situación en la que no funcionará, la respuesta habitual a cualquier problema ha sido "¡oh, solo GAC!". 8 D
¡Espero que ayude!
fuente
Aunque este es un documento antiguo, me ayudó a resolver el problema de que 'HintPath' se ignorara en otra máquina. Fue porque la DLL referenciada también necesitaba estar en el control de código fuente:
https://msdn.microsoft.com/en-us/library/ee817675.aspx#tdlg_ch4_includeoutersystemassemblieswithprojects
Extracto:
fuente