15/7/2010 16:32 El Bruno

[MSBUILD] HowTo: Resolver referencias en compilación desde directorios externos, desde la GAC (o desde Twitter ^^ !!)

image47dd1de4

Buenas,

uno de los problemas más usuales con los que solemos encontrarnos en los entornos de compilación, es definir una forma para que las compilaciones resuelvan las dependencias con las que se compilan las soluciones. Si eres una persona organizada y utilizas referencias con paths relativos almacenados en el Source Control (por ejemplo: ..\..\References\EntLib.Common.dll); no tendrás ningún problemas. Pero si en cambio tienes una ensalada de referencias repartidas por directorios de red, o en la GAC, pues el MSBuild puede chillar un poco.

Para estos casos, lo ideal es conocer un poco como funciona la tarea ResolveAssemblyReference, que es una tarea que ejecuta MSBuild en tiempo de compilación para resolver las referencias con las que compila un proyecto. No voy a entrar en detalle sobre esta tarea, ya que el link de la MSDN explica cuales son los parámetros con los que trabaja, pero si comentar que para resolver referencias en ubicaciones externas, es posible utilizar AdditionalReferencePath para esto.

Por ejemplo, si tenemos dlls repartidas por varios sitios, un ejemplo como el siguiente puede sernos de ayuda:

   1: <!-- Paths adicionales que se utilizaran para la compilacion -->
   2: <ItemGroup Label="Additional Reference Path">
   3:   <AdditionalReferencePath Include="\\SERVER\referencias\" />
   4:   <AdditionalReferencePath Include="C:\MasReferencias\" />
   5:   <AdditionalReferencePath Include="C:\LasReferenciasQueFaltan\" />
   6: </ItemGroup>

En el ejemplo anterior, el compilador al momento de intentar resolver un ensamblado, intentará obtenerlo desde estas ubicaciones, respetando el orden con el que las hemos definido. Y si no lo encuentra, recién en este momento lo buscará en la GAC. Estos 2 puntos son importantes ya que si tienes ensamblados “repetidos” (un escenario que aborrezco, pero que es muy frecuente), pues ve tu a saber con que versión estás compilando.

Pequeño tip, que me apunto para no olvidarme en el futuro Open-mouthed smile

 

Saludos @ Here

El Bruno

Archivado en: ,,
Comparte este post:

# re: [MSBUILD] HowTo: Resolver referencias en compilación desde directorios externos, desde la GAC (o desde Twitter ^^ !!)

Friday, July 16, 2010 1:43 PM by pregunton cojonero

La GAC prevalece siempre ante el bin. Si una dll A.dll 1.0.0.0 se encuentra en la GAC y una aplicación tiene la dll A.dll 1.0.0.0  en la carpeta bin, siempre buscará en la GAC.

es así ?

salugrz

# re: [MSBUILD] HowTo: Resolver referencias en compilación desde directorios externos, desde la GAC (o desde Twitter ^^ !!)

Friday, July 16, 2010 1:55 PM by El Bruno

@pregunton buenas,

pues depende del tipo de ejecucion (mira el link debajo), pero básicamente es:

If SafeDllSearchMode is enabled, the search order is as follows:

  1. The directory from which the application loaded.

  2. The system directory. Use the GetSystemDirectory function to get the path of this directory.

  3. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.

  4. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.

  5. The current directory.

  6. The directories that are listed in the PATH environment variable. Note that this does not include the per-application path specified by the App Paths registry key. The App Paths key is not used when computing the DLL search path.

If SafeDllSearchMode is disabled, the search order is as follows:

  1. The directory from which the application loaded.

  2. The current directory.

  3. The system directory. Use the GetSystemDirectory function to get the path of this directory.

  4. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.

  5. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.

  6. The directories that are listed in the PATH environment variable. Note that this does not include the per-application path specified by the App Paths registry key. The App Paths key is not used when computing the DLL search path.

Salu2

fuente: msdn.microsoft.com/.../ms682586%28VS.85%29.aspx

# re: [MSBUILD] HowTo: Resolver referencias en compilación desde directorios externos, desde la GAC (o desde Twitter ^^ !!)

Friday, July 16, 2010 5:09 PM by Eduard Tomàs i Avellana

@Bruno

Lo que has puesto creo que se refiere a LoadLibrary, o la carga nativa de DLLs... pero el CLR tiene sus propias normas al respecto...

1. Checks the global assembly cache. If the assembly is found there, the runtime uses this assembly.

2. Probes for the assembly using the following steps:

   2.1 If configuration and publisher policy do not affect the original reference and if the bind request was created using the AssemblyLoadFrom method, the runtime checks for location hints.

   2.2 If a codebase is found in the configuration files, the runtime checks only this location. If this probe fails, the runtime determines that the binding request failed and no other probing occurs.

   2.3 Probes for the assembly using the heuristics described in the probing section (msdn.microsoft.com/.../15hyw9x3.aspx). If the assembly is not found after probing, the runtime requests the Windows Installer to provide the assembly. This acts as an install-on-demand feature.

Fuente: msdn.microsoft.com/.../15hyw9x3.aspx

Resumiendo, básicamente:

1) Si está en la GAC, en la GAC

2) Si NO, en el mismo directorio que la aplicación o en un subdirectorio cuyo nombre sea el mismo que el del assembly.

OJO! Eso es al EJECUTAR, al compilar quien busca las referencias es el compilador, y tiene sus propias normas (básicmente el uso de reference path como menciona Bruno en este mismo post).

Saludos!

# re: [MSBUILD] HowTo: Resolver referencias en compilación desde directorios externos, desde la GAC (o desde Twitter ^^ !!)

Friday, July 16, 2010 5:16 PM by El Bruno

@Thanks por la info Eduard !!!

Salu2