Paso 4: Ubicar el ensamblado a través de códigos base o sondeos
Una vez que se haya determinado la versión correcta del ensamblado utilizando la información incluida en la referencia del ensamblado que realizó la llamada y en los archivos de configuración, y una vez que se haya realizado una comprobación en la caché global de ensamblados (sólo para ensamblados con nombre seguro), Common Language Runtime intenta buscar el ensamblado. El proceso de búsqueda de un ensamblado consta de los siguientes pasos:
Si se encuentra un elemento <codeBase> en el archivo de configuración de la aplicación, el motor en tiempo de ejecución sólo comprueba la ubicación indicada. Si se encuentra una coincidencia, se utiliza dicho ensamblado y no tiene lugar ninguna búsqueda. Si el ensamblado no encuentra allí, la solicitud de enlace produce un error.
Entonces, el motor en tiempo de ejecución comprueba el ensamblado al que se ha hecho referencia utilizando las reglas que se especifican más adelante en esta sección.
Nota |
---|
Si tiene varias versiones distintas de un ensamblado en un mismo directorio y desea hacer referencia a una versión específica del mismo, debe utilizar el elemento <codeBase> en lugar del atributo privatePath del elemento <probing>.Si utiliza el elemento <probing>, el motor en tiempo de ejecución detiene la búsqueda la primera vez que encuentra un ensamblado que coincide con el nombre sencillo de ensamblado al que se hace referencia, tanto si se trata de una coincidencia correcta como si no lo es.Si es una coincidencia correcta, se utiliza dicho ensamblado.Si no es una coincidencia correcta, se detiene la búsqueda y el enlace falla. |
Ubicar el ensamblado a través de códigos base
Se puede proporcionar información sobre el código base utilizando un elemento <codeBase> en un archivo de configuración. Este código base siempre se comprueba antes de que el motor en tiempo de ejecución intente buscar el ensamblado al que se ha hecho referencia. Si un archivo de directivas del editor que contiene la redirección de la versión final también contiene un elemento <codeBase>, será ese elemento <codeBase> el que se utilice. Por ejemplo, si en el archivo de configuración de la aplicación se especifica un elemento <codeBase>, y un archivo de directivas del editor que está reemplazando la información de la aplicación también especifica un elemento <codeBase>, se utiliza el elemento <codeBase> del archivo de directivas del editor.
Si no se encuentra ninguna coincidencia en la ubicación especificada por el elemento <codeBase>, la solicitud de enlace produce un error y el proceso se detiene. Si el motor en tiempo de ejecución determina que un ensamblado coincide con los criterios del ensamblado que ha efectuado la llamada, utiliza dicho ensamblado. Cuando se carga el archivo indicado en el elemento <codeBase> especificado, el motor en tiempo de ejecución se asegura de que el nombre, la versión, la referencia cultural y la clave pública coincidan con la referencia del ensamblado que ha realizado la llamada.
Nota |
---|
Los ensamblados a los que se hace referencia fuera del directorio raíz de la aplicación deben tener nombres seguros y deben estar instalados en la caché global de ensamblados o deben especificarse mediante el elemento <codeBase>. |
Ubicar el ensamblado a través de búsquedas
Si no hay ningún elemento <codeBase> en el archivo de configuración de la aplicación, el motor en tiempo de ejecución busca el ensamblado utilizando cuatro criterios:
Base de la aplicación, que es la ubicación raíz donde se ejecuta la aplicación.
Referencia cultural, que es el atributo de referencia cultural del ensamblado al que se ha hecho referencia.
Nombre, que es el nombre del ensamblado al que se ha hecho referencia.
Atributo privatePath del elemento <probing>, que es la lista definida por el usuario de subdirectorios que se encuentran dentro de la ubicación raíz. Esta ubicación puede especificarse en el archivo de configuración de la aplicación y en el código administrado mediante la propiedad AppendPrivatePath de un dominio de aplicación. Cuando se especifica en el código administrado, se busca en primer lugar el atributo privatePath de código administrado, seguido de la ruta de acceso especificada en el archivo de configuración de la aplicación.
Buscar en la base de la aplicación y en los directorios de referencia cultural
El motor en tiempo de ejecución siempre comienza a buscar en la base de la aplicación, que puede ser una dirección URL o el directorio raíz de la aplicación en un equipo. Si el ensamblado al que se hace referencia no se encuentra en la base de la aplicación y no se proporciona información de la referencia cultural, el motor en tiempo de ejecución busca cualquier subdirectorio con el nombre del ensamblado. Los directorios en los que se busca son los siguientes:
[base de aplicación] / [nombre de ensamblado].dll
[base de aplicación] / [nombre de ensamblado] / [nombre de ensamblado].dll
Si se especifica la información de referencia cultural para el ensamblado al que se hace referencia, sólo se busca en los siguientes directorios:
[base de aplicación] / [referencia cultural] / [nombre de ensamblado].dll
[base de aplicación] / [referencia cultural] / [nombre de ensamblado] / [nombre de ensamblado].dll
Búsqueda con el atributo privatePath
Además de buscar en los subdirectorios de referencia cultural y en los subdirectorios a los que se les ha asignado un nombre para el ensamblado al que se hace referencia, el motor en tiempo de ejecución busca también en los directorios especificados mediante el atributo privatePath del elemento <probing>. Los directorios especificados mediante el atributo privatePath deben ser subdirectorios del directorio raíz de la aplicación. Los directorios en los que se busca varían en función de que la información sobre la referencia cultural aparezca en la solicitud del ensamblado al que se hace referencia.
El motor en tiempo de ejecución detiene la búsqueda la primera vez que encuentra un ensamblado que coincide con el nombre sencillo de ensamblado al que se hace referencia, tanto si es una coincidencia correcta como si no lo es. Si es una coincidencia correcta, se utiliza dicho ensamblado. Si no es una coincidencia correcta, se detiene la búsqueda y el enlace falla.
Si se incluye información sobre la referencia cultural, se busca en los siguientes directorios:
[base de aplicación] / [ruta de ubicación] / [referencia cultural] / [nombre de ensamblado].dll
[base de aplicación] / [ruta de ubicación] / [referencia cultural] / [nombre de ensamblado] / [nombre de ensamblado].dll
Si no se incluye información sobre la referencia cultural, se busca en los siguientes directorios:
[base de aplicación] / [ruta de ubicación] / [nombre de ensamblado].dll
[base de aplicación] / [ruta de ubicación] / [nombre de ensamblado] / [nombre de ensamblado].dll
Ejemplos de búsqueda
Dada la siguiente información:
Nombre del ensamblado al que se hace referencia: myAssembly
Directorio raíz de la aplicación: http://www.code.microsoft.com
El elemento<probing> del archivo de configuración especifica: bin
Referencia cultural: de
El motor en tiempo de ejecución busca las siguientes direcciones URL:
http://www.code.microsoft.com/de/myAssembly.dll
http://www.code.microsoft.com/de/myAssembly/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll
Varios ensamblados con el mismo nombre
En el siguiente ejemplo se muestra cómo configurar varios ensamblados con el mismo nombre.
<dependentAssembly>
<assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
<codeBase version="1.0.0.0" href="v1/Server.dll"/>
<codeBase version="2.0.0.0" href="v2/Server.dll"/>
</dependentAssembly>
Búsqueda de otras ubicaciones
La ubicación de ensamblados también puede determinarse mediante el contexto de enlace actual. Esto ocurre con mayor frecuencia en escenarios de interoperabilidad COM y cuando se utiliza el método Assembly.LoadFrom. Si un ensamblado utiliza el método LoadFrom para hacer referencia a otro ensamblado, se considera que la ubicación del ensamblado que realiza la llamada es una sugerencia sobre dónde encontrar el ensamblado al que se hace referencia. Si se encuentra una coincidencia, se carga dicho ensamblado. Si no se encuentran coincidencias, el motor en tiempo de ejecución prosigue con la semántica de búsqueda y después realiza una consulta a Windows Installer para proporcionar el ensamblado. Si no se proporciona ningún ensamblado que coincida con la solicitud de enlace, se produce una excepción. Esta excepción es una excepción TypeLoadException en código administrado si no se establecen referencias a un tipo o es una excepción FileNotFoundException si no se encuentra un ensamblado que se estuviera cargando.
Por ejemplo, si el ensamblado Assembly1 hace referencia al ensamblado Assembly2 y Assembly1 se estaba descargando desde http://www.code.microsoft.com/utils, dicha ubicación se considera una pista sobre dónde buscar Assembly2.dll. El motor en tiempo de ejecución busca entonces el ensamblado en http://www.code.microsoft.com/utils/Assembly2.dll y en http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. Si no se encuentra Assembly2 en ninguna de estas ubicaciones, el motor en tiempo de ejecución realiza una consulta a Windows Installer.
Vea también
Conceptos
Cómo el motor en tiempo de ejecución ubica ensamblados
Paso 1: Examinar los archivos de configuración
Paso 2: Comprobar los ensamblados a los que se hizo referencia previamente