Cómo el motor en tiempo de ejecución ubica ensambladosHow the Runtime Locates Assemblies

Para implementar correctamente una aplicación de .NET Framework, debe entender la manera en que Common Language Runtime busca y enlaza los ensamblados que componen la aplicación.To successfully deploy your .NET Framework application, you must understand how the common language runtime locates and binds to the assemblies that make up your application. De forma predeterminada, runtime intenta enlazar con la versión exacta de un ensamblado con el que se creó la aplicación.By default, the runtime attempts to bind with the exact version of an assembly that the application was built with. Este comportamiento predeterminado puede reemplazarse con los valores del archivo de configuración.This default behavior can be overridden by configuration file settings.

Common Language Runtime realiza una serie de pasos cuando intenta buscar un ensamblado y resolver una referencia de ensamblado.The common language runtime performs a number of steps when attempting to locate an assembly and resolve an assembly reference. Cada paso se explica en las secciones siguientes.Each step is explained in the following sections. El sondeo de términos suele usarse cuando se describe la manera en que el tiempo de ejecución busca ensamblados; hace referencia al conjunto de heurística que se usa para buscar el ensamblado en función de su nombre y referencia cultural.The term probing is often used when describing how the runtime locates assemblies; it refers to the set of heuristics used to locate the assembly based on its name and culture.

Nota

Puede ver la información de enlace en el archivo de registro usando el Visor de registro de enlaces de ensamblados (Fuslogvw.exe), que se incluye en el Kit de desarrollo de software de Windows (SDK)Windows Software Development Kit (SDK).You can view binding information in the log file using the Assembly Binding Log Viewer (Fuslogvw.exe), which is included in the Kit de desarrollo de software de Windows (SDK)Windows Software Development Kit (SDK).

Iniciar el enlaceInitiating the Bind

El proceso de buscar y enlazar a un ensamblado comienza cuando el tiempo de ejecución intenta resolver una referencia a otro ensamblado.The process of locating and binding to an assembly begins when the runtime attempts to resolve a reference to another assembly. Esta referencia puede ser estática o dinámica.This reference can be either static or dynamic. El compilador registra las referencias estáticas en los metadatos del manifiesto del ensamblado en tiempo de compilación.The compiler records static references in the assembly manifest's metadata at build time. Las referencias dinámicas se construyen sobre la marcha como resultado de llamar a varios métodos, como Assembly.Load.Dynamic references are constructed on the fly as a result of calling various methods, such as Assembly.Load.

La mejor manera de hacer referencia a un ensamblado es usar una referencia completa, incluido el nombre del ensamblado, la versión, la referencia cultural y el token de clave pública (si existe).The preferred way to reference an assembly is to use a full reference, including the assembly name, version, culture, and public key token (if one exists). El tiempo de ejecución usa esta información para buscar el ensamblado, siguiendo los pasos descritos más adelante en esta sección.The runtime uses this information to locate the assembly, following the steps described later in this section. El tiempo de ejecución usa el mismo proceso de resolución, sin tener en cuenta si la referencia es para un ensamblado estático o dinámico.The runtime uses the same resolution process regardless of whether the reference is for a static or dynamic assembly.

También puede hacer una referencia dinámica a un ensamblado proporcionando el método de llamada únicamente con información parcial sobre el ensamblado, por ejemplo especificando solo el nombre de ensamblado.You can also make a dynamic reference to an assembly by providing the calling method with only partial information about the assembly, such as specifying only the assembly name. En este caso, el ensamblado solo se busca en el directorio de la aplicación y no se realiza ninguna otra comprobación.In this case, only the application directory is searched for the assembly, and no other checking occurs. Se hace una referencia parcial mediante cualquiera de los diversos métodos para cargar ensamblados, como Assembly.Load o AppDomain.Load.You make a partial reference using any of the various methods for loading assemblies such as Assembly.Load or AppDomain.Load.

Por último, puede hacer una referencia dinámica mediante un método como Assembly.Load y facilitar solo información parcial. Después, califique la referencia mediante el elemento <qualifyAssembly> en el archivo de configuración de la aplicación.Finally, you can make a dynamic reference using a method such as Assembly.Load and provide only partial information; you then qualify the reference using the <qualifyAssembly> element in the application configuration file. Este elemento permite proporcionar información de referencia completa (nombre, versión, referencia cultural y, si procede, el token de clave pública) en el archivo de configuración de la aplicación, en lugar de en el código.This element allows you to provide the full reference information (name, version, culture and, if applicable, the public key token) in your application configuration file instead of in your code. Use esta técnica si desea completar una referencia a un ensamblado fuera del directorio de la aplicación, o si desea hacer referencia a un ensamblado en la caché global de ensamblados pero prefiere la comodidad de especificar la referencia completa en el archivo de configuración en lugar de en el código.You would use this technique if you wanted to fully qualify a reference to an assembly outside the application directory, or if you wanted to reference an assembly in the global assembly cache but you wanted the convenience of specifying the full reference in the configuration file instead of in your code.

Nota

Este tipo de referencia parcial no debe usarse con ensamblados que se comparten entre varias aplicaciones.This type of partial reference should not be used with assemblies that are shared among several applications. Como los valores de configuración se aplican por aplicación y no por ensamblado, un ensamblado compartido que use este tipo de referencia parcial requerirá que cada aplicación que use el ensamblado compartido tenga la información calificadora en su archivo de configuración.Because configuration settings are applied per application and not per assembly, a shared assembly using this type of partial reference would require each application using the shared assembly to have the qualifying information in its configuration file.

El tiempo de ejecución sigue estos pasos para resolver una referencia de ensamblado:The runtime uses the following steps to resolve an assembly reference:

  1. Determina la versión correcta del ensamblado examinando los archivos de configuración aplicables, incluido el archivo de configuración de la aplicación, el archivo de directiva de edición y el archivo de configuración del equipo.Determines the correct assembly version by examining applicable configuration files, including the application configuration file, publisher policy file, and machine configuration file. Si el archivo de configuración se encuentra en un equipo remoto, el tiempo de ejecución debe buscar y descargar el archivo de configuración de la aplicación en primer lugar.If the configuration file is located on a remote machine, the runtime must locate and download the application configuration file first.

  2. Comprueba si el nombre de ensamblado ya estuvo enlazado y, si es así, usa el ensamblado cargado previamente.Checks whether the assembly name has been bound to before and, if so, uses the previously loaded assembly. Si una solicitud anterior para cargar el ensamblado produjo un error, la solicitud produce un error inmediatamente sin intentar cargar el ensamblado.If a previous request to load the assembly failed, the request is failed immediately without attempting to load the assembly.

    Nota

    El almacenamiento en caché de errores de enlace de ensamblados es nuevo en .NET Framework versión 2.0.The caching of assembly binding failures is new in the .NET Framework version 2.0.

  3. Comprueba la caché global de ensamblados.Checks the global assembly cache. Si el ensamblado se encuentra allí, el tiempo de ejecución usa este ensamblado.If the assembly is found there, the runtime uses this assembly.

  4. Sondea el ensamblado siguiendo estos siguientes pasos:Probes for the assembly using the following steps:

    1. Si la directiva de configuración y edición no afecta a la referencia original y si la solicitud de enlace se creó usando el método Assembly.LoadFrom , el tiempo de ejecución comprueba las sugerencias de ubicación.If configuration and publisher policy do not affect the original reference and if the bind request was created using the Assembly.LoadFrom method, the runtime checks for location hints.

    2. Si se encuentra un código base en los archivos de configuración, el tiempo de ejecución solo comprueba esta ubicación.If a codebase is found in the configuration files, the runtime checks only this location. Si se produce un error en este sondeo, el tiempo de ejecución determina que la solicitud de enlace produjo un error y no se llevan a cabo más sondeos.If this probe fails, the runtime determines that the binding request failed and no other probing occurs.

    3. Sondea el ensamblado mediante la heurística descrita en la sección de sondeo.Probes for the assembly using the heuristics described in the probing section. Si no se encuentra el ensamblado tras el sondeo, el tiempo de ejecución solicita a Windows Installer que proporcione un ensamblado.If the assembly is not found after probing, the runtime requests the Windows Installer to provide the assembly. Esto actúa como una característica de instalación a petición.This acts as an install-on-demand feature.

      Nota

      No se produce ninguna comprobación de versión en busca de ensamblados sin nombres seguros, y el tiempo de ejecución no protege la caché global de ensamblados para los ensamblados sin nombres seguros.There is no version checking for assemblies without strong names, nor does the runtime check in the global assembly cache for assemblies without strong names.

Paso 1: Examinar los archivos de configuraciónStep 1: Examining the Configuration Files

El comportamiento de enlace de ensamblados puede configurarse en niveles diferentes en función de tres archivos XML:Assembly binding behavior can be configured at different levels based on three XML files:

  • Archivo de configuración de la aplicación.Application configuration file.

  • Archivo de directiva de edición.Publisher policy file.

  • Archivo de configuración del equipo.Machine configuration file.

Estos archivos tienen la misma sintaxis y proporcionan información como las redirecciones de enlaces, la ubicación del código y los modos de enlace de ensamblados concretos.These files follow the same syntax and provide information such as binding redirects, the location of code, and binding modes for particular assemblies. Cada archivo de configuración puede contener un elemento <assemblyBinding> que redirige el proceso de enlace.Each configuration file can contain an <assemblyBinding> element that redirects the binding process. Los elementos secundarios del elemento <assemblyBinding> incluyen el elemento <dependentAssembly>.The child elements of the <assemblyBinding> element include the <dependentAssembly> element. Los elementos secundarios del elemento <dependentAssembly> incluyen el elemento <assemblyIdentity>, el elemento <bindingRedirect> y el elemento <codeBase>.The children of <dependentAssembly> element include the <assemblyIdentity> element, the <bindingRedirect> element, and the <codeBase> element.

Nota

Puede encontrarse información de configuración en los tres archivos de configuración; no todos los elementos son válidos en todos los archivos de configuración.Configuration information can be found in the three configuration files; not all elements are valid in all configuration files. Por ejemplo, la información sobre el modo de enlace y la ruta de acceso privada solo puede estar en el archivo de configuración de la aplicación.For example, binding mode and private path information can only be in the application configuration file. Para obtener una lista completa de la información contenida en cada archivo, consulte Configurar aplicaciones con archivos de configuración.For a complete list of the information that is contained in each file, see Configuring Apps by Using Configuration Files.

Archivo de configuración de aplicaciónApplication Configuration File

En primer lugar, Common Language Runtime comprueba el archivo de configuración de la aplicación en busca de información que reemplace la información de versión almacenada en el manifiesto del ensamblado que realiza la llamada.First, the common language runtime checks the application configuration file for information that overrides the version information stored in the calling assembly's manifest. El archivo de configuración de la aplicación puede implementarse con una aplicación, pero no es necesario para la ejecución de la aplicación.The application configuration file can be deployed with an application, but is not required for application execution. Normalmente, la recuperación de este archivo es casi instantánea, pero en los casos en que la base de la aplicación se encuentra en un equipo remoto, como en un escenario basado en web de Internet Explorer, el archivo de configuración debe estar descargado.Usually the retrieval of this file is almost instantaneous, but in situations where the application base is on a remote computer, such as in an Internet Explorer Web-based scenario, the configuration file must be downloaded.

Para los ejecutables de cliente, el archivo de configuración de la aplicación reside en el mismo directorio que el ejecutable de la aplicación y tiene el mismo nombre base que el ejecutable con la extensión .config.For client executables, the application configuration file resides in the same directory as the application's executable and has the same base name as the executable with a .config extension. Por ejemplo, el archivo de configuración de C:\Program Files\Myapp\Myapp.exe es C:\Program Files\Myapp\Myapp.exe.config. En un escenario basado en explorador, el archivo HTML debe usar el elemento <link> para apuntar explícitamente al archivo de configuración.For example, the configuration file for C:\Program Files\Myapp\Myapp.exe is C:\Program Files\Myapp\Myapp.exe.config. In a browser-based scenario, the HTML file must use the <link> element to explicitly point to the configuration file.

El código siguiente proporciona un ejemplo sencillo de un archivo de configuración de la aplicación.The following code provides a simple example of an application configuration file. Este ejemplo agrega un TextWriterTraceListener a la colección Listeners para habilitar la grabación de la información de depuración en un archivo.This example adds a TextWriterTraceListener to the Listeners collection to enable recording debug information to a file.

<configuration>  
   <system.diagnostics>  
      <trace useGlobalLock="false" autoflush="true" indentsize="0">  
         <listeners>  
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />  
         </listeners>  
      </trace>  
   </system.diagnostics>  
</configuration>  

Archivo de directiva de ediciónPublisher Policy File

En segundo lugar, el tiempo de ejecución examina el archivo de directiva de edición, si existe.Second, the runtime examines the publisher policy file, if one exists. Los archivos de directiva de edición se distribuyen mediante un editor de componentes como una corrección o actualización de un componente compartido.Publisher policy files are distributed by a component publisher as a fix or update to a shared component. Estos archivos contienen información de compatibilidad emitida por el editor del componente compartido, que dirige una referencia de ensamblado a una nueva versión.These files contain compatibility information issued by the publisher of the shared component that directs an assembly reference to a new version. A diferencia de los archivos de configuración de la aplicación y del equipo, los archivos de directiva de edición están contenidos en su propio ensamblado, que debe instalarse en la caché global de ensamblados.Unlike application and machine configuration files, publisher policy files are contained in their own assembly that must be installed in the global assembly cache.

A continuación se muestra un ejemplo de un archivo de configuración de directiva de edición:The following is an example of a Publisher Policy configuration file:

<configuration>  
    <runtime>  
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  

            <dependentAssembly>  
                <assemblyIdentity name="asm6" publicKeyToken="c0305c36380ba429" />   
                <bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0"/>    
            </dependentAssembly>  

        </assemblyBinding>  
    </runtime>  
</configuration>  

Para crear un ensamblado, puede usar la herramienta Al.exe (Assembly Linker) con un comando como el siguiente:To create an assembly, you can use the Al.exe (Assembly Linker) tool with a command such as the following:

Al.exe /link:asm6.exe.config /out:policy.3.0.asm6.dll /keyfile: compatkey.dat /v:3.0.0.0  

compatkey.dat es un archivo de clave de nombre seguro.compatkey.dat is a strong-name key file. Este comando crea un ensamblado con nombre seguro que se puede colocar en la caché global de ensamblados.This command creates a strong-named assembly you can place in the global assembly cache.

Nota

La directiva de edición afecta a todas las aplicaciones que usan un componente compartido.Publisher policy affects all applications that use a shared component.

El archivo de configuración de directiva de edición reemplaza la información de versión que procede de la aplicación (es decir, que procede del manifiesto del ensamblado o del archivo de configuración de la aplicación).The publisher policy configuration file overrides version information that comes from the application (that is, from the assembly manifest or from the application configuration file). Si no hay ninguna instrucción en el archivo de configuración de la aplicación para redirigir la versión especificada en el manifiesto del ensamblado, el archivo de directiva de edición reemplaza la versión especificada en el manifiesto del ensamblado.If there is no statement in the application configuration file to redirect the version specified in the assembly manifest, the publisher policy file overrides the version specified in the assembly manifest. Sin embargo, si hay una instrucción de redirección en el archivo de configuración de la aplicación, la directiva de edición reemplaza esa versión, en lugar de la especificada en el manifiesto.However, if there is a redirecting statement in the application configuration file, publisher policy overrides that version rather than the one specified in the manifest.

Cuando se actualiza un componente compartido y todas las aplicaciones que lo usan deben seleccionar la nueva versión de dicho componente, se usa un archivo de directiva de edición.A publisher policy file is used when a shared component is updated and the new version of the shared component should be picked up by all applications using that component. La configuración del archivo de directiva de edición invalida la configuración del archivo de configuración de la aplicación, a menos que este último aplique el modo seguro.The settings in the publisher policy file override settings in the application configuration file, unless the application configuration file enforces safe mode.

Modo seguroSafe Mode

Los archivos de directiva de edición por lo general se instalan explícitamente como parte de un Service Pack o de una actualización del programa.Publisher policy files are usually explicitly installed as part of a service pack or program update. Si hay algún problema con el componente compartido actualizado, puede pasar por alto los reemplazos realizados en el archivo de directiva de edición usando el modo seguro.If there is any problem with the upgraded shared component, you can ignore the overrides in the publisher policy file using safe mode. El modo seguro está determinado por el elemento <publisherPolicy apply="yes|no"/>, que se encuentra solo en el archivo de configuración de la aplicación.Safe mode is determined by the <publisherPolicy apply="yes|no"/> element, located only in the application configuration file. Especifica si la información de configuración de directiva de edición debe quitarse del proceso de enlace.It specifies whether the publisher policy configuration information should be removed from the binding process.

El modo seguro se puede establecer para toda la aplicación o para los ensamblados seleccionados.Safe mode can be set for the entire application or for selected assemblies. Es decir, puede desactivar la directiva para todos los ensamblados que componen la aplicación, o bien activarla para algunos ensamblados pero no para otros.That is, you can turn off the policy for all assemblies that make up the application, or turn it on for some assemblies but not others. Para aplicar de forma selectiva la directiva de edición a los ensamblados que componen una aplicación, establezca <publisherPolicy apply=no/> y especifique los ensamblados que desee que se vean afectados mediante el elemento <dependentAssembly>.To selectively apply publisher policy to assemblies that make up an application, set <publisherPolicy apply=no/> and specify which assemblies you want to be affected using the <dependentAssembly> element. Para aplicar la directiva de edición a todos los ensamblados que componen la aplicación, establezca <publisherPolicy apply=no/> sin elementos de ensamblado dependiente.To apply publisher policy to all assemblies that make up the application, set <publisherPolicy apply=no/> with no dependent assembly elements. Para obtener más información acerca de la configuración, consulte Configurar aplicaciones con archivos de configuración.For more about configuration, see Configuring Apps by using Configuration Files.

Archivo de configuración del equipoMachine Configuration File

En tercer lugar, el tiempo de ejecución examina el archivo de configuración del equipo.Third, the runtime examines the machine configuration file. Este archivo, denominado Machine.config, reside en el equipo local, el subdirectorio Config del directorio raíz donde está instalado el tiempo de ejecución.This file, called Machine.config, resides on the local computer in the Config subdirectory of the root directory where the runtime is installed. Los administradores pueden usar este archivo para especificar las restricciones de enlace de ensamblado locales de ese equipo.This file can be used by administrators to specify assembly binding restrictions that are local to that computer. La configuración incluida en el archivo de configuración del equipo tiene prioridad sobre otras opciones de configuración; sin embargo, esto no significa que todos los valores de configuración deban colocarse en este archivo.The settings in the machine configuration file take precedence over all other configuration settings; however, this does not mean that all configuration settings should be put in this file. La versión determinada por el archivo de directiva del administrador es final y no se puede invalidar.The version determined by the administrator policy file is final, and cannot be overridden. Los reemplazos especificados en el archivo Machine.config afectan a todas las aplicaciones.Overrides specified in the Machine.config file affect all applications. Para obtener más información acerca de los archivos de configuración, consulte Configurar aplicaciones con archivos de configuración.For more information about configuration files, see Configuring Apps by using Configuration Files.

Paso 2: Comprobar los ensamblados a los que se hizo referencia previamenteStep 2: Checking for Previously Referenced Assemblies

Si el ensamblado solicitado también se solicitó en llamadas anteriores, Common Language Runtime usa el ensamblado que ya está cargado.If the requested assembly has also been requested in previous calls, the common language runtime uses the assembly that is already loaded. Esto puede tener consecuencias cuando se asignan nombres a los ensamblados que componen una aplicación.This can have ramifications when naming assemblies that make up an application. Para obtener más información sobre los nombres de ensamblados, vea Nombres de ensamblados.For more information about naming assemblies, see Assembly Names.

Si una solicitud anterior para el ensamblado produjo un error, las solicitudes posteriores para el ensamblado producen un error inmediatamente sin intentar cargar el ensamblado.If a previous request for the assembly failed, subsequent requests for the assembly are failed immediately without attempting to load the assembly. A partir de .NET Framework versión 2.0, los errores de enlace de ensamblado se almacenan en caché y la información en caché se usa para determinar si se intenta cargar el ensamblado.Starting with the .NET Framework version 2.0, assembly binding failures are cached, and the cached information is used to determine whether to attempt to load the assembly.

Nota

Para revertir al comportamiento de .NET Framework versiones 1.0 y 1.1, que no almacenaban en caché los errores de enlace, incluya el elemento <disableCachingBindingFailures> en el archivo de configuración.To revert to the behavior of the .NET Framework versions 1.0 and 1.1, which did not cache binding failures, include the <disableCachingBindingFailures> Element in your configuration file.

Paso 3: Comprobar la memoria caché global de ensambladosStep 3: Checking the Global Assembly Cache

Para los ensamblados con nombre seguro, el proceso de enlace continúa con la búsqueda en la caché global de ensamblados.For strong-named assemblies, the binding process continues by looking in the global assembly cache. La caché global de ensamblados almacena los ensamblados que varias aplicaciones pueden usar en un equipo.The global assembly cache stores assemblies that can be used by several applications on a computer. Todos los ensamblados de la caché global de ensamblados deben tener nombres seguros.All assemblies in the global assembly cache must have strong names.

Paso 4: Ubicar el ensamblado a través de códigos base o sondeosStep 4: Locating the Assembly through Codebases or Probing

Una vez determinada la versión correcta del ensamblado usando la información contenida en la referencia del ensamblado que realiza la llamada y en los archivos de configuración, y una vez protegida la caché global de ensamblados (solo para ensamblados con nombre seguro), Common Language Runtime intenta buscar el ensamblado.After the correct assembly version has been determined by using the information in the calling assembly's reference and in the configuration files, and after it has checked in the global assembly cache (only for strong-named assemblies), the common language runtime attempts to find the assembly. El proceso de buscar un ensamblado conlleva los pasos siguientes:The process of locating an assembly involves the following steps:

  1. Si se encuentra un elemento <codeBase> en el archivo de configuración de la aplicación, el tiempo de ejecución comprueba la ubicación especificada.If a <codeBase> element is found in the application configuration file, the runtime checks the specified location. Si se encuentra una coincidencia, se usa ese ensamblado y no se realiza ningún sondeo.If a match is found, that assembly is used and no probing occurs. Si no se encuentra ahí el ensamblado, se produce un error en la solicitud de enlace.If the assembly is not found there, the binding request fails.

  2. Entonces, el tiempo de ejecución sondea el ensamblado al que se hace referencia usando las reglas que se especifican más adelante en esta sección.The runtime then probes for the referenced assembly using the rules specified later in this section.

Nota

Si tiene varias versiones de un ensamblado en un directorio y desea hacer referencia a una versión concreta de dicho ensamblado, debe usar el elemento <codeBase> en lugar del atributo privatePath del elemento <probing>.If you have multiple versions of an assembly in a directory and you want to reference a particular version of that assembly, you must use the <codeBase> element instead of the privatePath attribute of the <probing> element. Si usa el elemento <probing>, el tiempo de ejecución detiene el sondeo la primera vez que encuentra un ensamblado que coincida con el nombre sencillo de ensamblado al que se hace referencia, tanto si es una coincidencia correcta como si no.If you use the <probing> element, the runtime stops probing the first time it finds an assembly that matches the simple assembly name referenced, whether it is a correct match or not. Si es una coincidencia correcta, se usa dicho ensamblado.If it is a correct match, that assembly is used. Si no es una coincidencia correcta, detiene el sondeo y el enlace produce un error.If it is not a correct match, probing stops and binding fails.

Ubicar el ensamblado a través de códigos baseLocating the Assembly through Codebases

Se puede proporcionar información de código base mediante un elemento <codeBase> en un archivo de configuración.Codebase information can be provided by using a <codeBase> element in a configuration file. Este código base siempre se comprueba antes de que el tiempo de ejecución intente sondear el ensamblado al que se hace referencia.This codebase is always checked before the runtime attempts to probe for the referenced assembly. Si un archivo de directiva de edición que contiene la redirección de versión final también contiene un elemento <codeBase>, dicho elemento <codeBase> es el que se usa.If a publisher policy file containing the final version redirect also contains a <codeBase> element, that <codeBase> element is the one that is used. Por ejemplo, si el archivo de configuración de la aplicación especifica un elemento <codeBase> y un archivo de directiva de edición que está reemplazando la información de la aplicación también especifica un elemento <codeBase>, se usa el elemento <codeBase> del archivo de directiva de edición.For example, if your application configuration file specifies a <codeBase> element, and a publisher policy file that is overriding the application information also specifies a <codeBase> element, the <codeBase> element in the publisher policy file is used.

Si no se encuentra ninguna coincidencia en la ubicación especificada por el elemento <codeBase>, se produce un error en la solicitud de enlace y no se realizan más acciones.If no match is found at the location specified by the <codeBase> element, the bind request fails and no further steps are taken. Si el tiempo de ejecución determina que un ensamblado coincide con los criterios del ensamblado que realiza la llamada, usa dicho ensamblado.If the runtime determines that an assembly matches the calling assembly's criteria, it uses that assembly. Cuando se carga el archivo especificado por el elemento <codeBase> determinado, el tiempo de ejecución realiza una comprobación para asegurarse de que el nombre, la versión, la referencia cultural y la clave pública coinciden con la referencia del ensamblado de llamada.When the file specified by the given <codeBase> element is loaded, the runtime checks to make sure that the name, version, culture, and public key match the calling assembly's reference.

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 especificarse usando el elemento <codeBase>.Referenced assemblies outside the application's root directory must have strong names and must either be installed in the global assembly cache or specified using the <codeBase> element.

Ubicar el ensamblado a través del sondeoLocating the Assembly through Probing

Si no hay ningún elemento <codeBase> en el archivo de configuración de la aplicación, el tiempo de ejecución sondea el ensamblado usando cuatro criterios:If there is no <codeBase> element in the application configuration file, the runtime probes for the assembly using four criteria:

  • Base de la aplicación, que es la ubicación raíz donde se ejecuta la aplicación.Application base, which is the root location where the application is being executed.

  • Referencia cultural, que es el atributo de referencia cultural del ensamblado al que se hace referencia.Culture, which is the culture attribute of the assembly being referenced.

  • Nombre, que es el nombre del ensamblado al que se hace referencia.Name, which is the name of the referenced assembly.

  • Atributo privatePath del elemento <probing>, que es la lista definida por el usuario de subdirectorios bajo la ubicación raíz.The privatePath attribute of the <probing> element, which is the user-defined list of subdirectories under the root location. Esta ubicación puede especificarse en el archivo de configuración de la aplicación y en el código administrado mediante la propiedad AppDomainSetup.PrivateBinPath para un dominio de aplicación.This location can be specified in the application configuration file and in managed code using the AppDomainSetup.PrivateBinPath property for an application domain. Cuando se especifica en código administrado, se sondea primero el código administrado privatePath , seguido de la ruta de acceso especificada en el archivo de configuración de la aplicación.When specified in managed code, the managed code privatePath is probed first, followed by the path specified in the application configuration file.

Sondear los directorios de base de la aplicación y de referencia culturalProbing the Application Base and Culture Directories

El tiempo de ejecución siempre empieza a sondear 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.The runtime always begins probing in the application's base, which can be either a URL or the application's root directory on a computer. Si el ensamblado al que se hace referencia no se encuentra en la base de la aplicación y si no se proporciona ninguna información de referencia cultural, el tiempo de ejecución busca cualquier subdirectorio con el nombre del ensamblado.If the referenced assembly is not found in the application base and no culture information is provided, the runtime searches any subdirectories with the assembly name. Los directorios sondeados incluyen:The directories probed include:

[base de la aplicación] / [nombre de ensamblado].dll[application base] / [assembly name].dll

[base de la aplicación] / [nombre de ensamblado] / [nombre de ensamblado].dll[application base] / [assembly name] / [assembly name].dll

Si se especifica información de referencia cultural para el ensamblado al que se hace referencia, solo se busca en los directorios siguientes:If culture information is specified for the referenced assembly, only the following directories are probed:

[base de la aplicación] / [referencia cultural] / [nombre de ensamblado].dll[application base] / [culture] / [assembly name].dll

[base de la aplicación] / [referencia cultural] / [nombre de ensamblado] / [nombre de ensamblado].dll[application base] / [culture] / [assembly name] / [assembly name].dll

Sondear con el atributo privatePathProbing with the privatePath Attribute

Además de los subdirectorios de referencia cultural y los subdirectorios con el nombre del ensamblado al que se hace referencia, el tiempo de ejecución también sondea los directorios especificados mediante el atributo privatePath del elemento <probing>.In addition to the culture subdirectories and the subdirectories named for the referenced assembly, the runtime also probes directories specified using the privatePath attribute of the <probing> element. Los directorios especificados mediante el atributo privatePath debe ser subdirectorios del directorio raíz de la aplicación.The directories specified using the privatePath attribute must be subdirectories of the application's root directory. Los directorios sondeados varían en función de si se incluye información de referencia cultural en la solicitud del ensamblado al que se hace referencia.The directories probed vary depending on whether culture information is included in the referenced assembly request.

El tiempo de ejecución detiene el sondeo la primera vez que encuentra un ensamblado que coincida con el nombre sencillo de ensamblado al que se hace referencia, tanto si es una coincidencia correcta como si no.The runtime stops probing the first time it finds an assembly that matches the simple assembly name referenced, whether it is a correct match or not. Si es una coincidencia correcta, se usa dicho ensamblado.If it is a correct match, that assembly is used. Si no es una coincidencia correcta, detiene el sondeo y el enlace produce un error.If it is not a correct match, probing stops and binding fails.

Si se incluye la referencia cultural, se busca en los directorios siguientes:If culture is included, the following directories are probed:

[base de la aplicación] / [binpath] / [referencia cultural] / [nombre de ensamblado].dll[application base] / [binpath] / [culture] / [assembly name].dll

[base de la aplicación] / [binpath] / [referencia cultural] / [nombre de ensamblado] / [nombre de ensamblado].dll[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll

Si no se incluye información de referencia cultural, se busca en los directorios siguientes:If culture information is not included, the following directories are probed:

[base de la aplicación] / [binpath] / [nombre de ensamblado].dll[application base] / [binpath] / [assembly name].dll

[base de la aplicación] / [binpath] / [nombre de ensamblado] / [nombre de ensamblado].dll[application base] / [binpath] / [assembly name] / [assembly name].dll

Ejemplos de sondeoProbing Examples

Dada la siguiente información:Given the following information:

El tiempo de ejecución sondea las direcciones URL siguientes:The runtime probes the following URLs:

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 nombreMultiple Assemblies with the Same Name

En el ejemplo siguiente se muestra cómo configurar varios ensamblados con el mismo nombre.The following example shows how to configure multiple assemblies with the same name.

<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>  

Otras ubicaciones sondeadasOther Locations Probed

La ubicación del ensamblado también puede determinarse mediante el contexto de enlace actual.Assembly location can also be determined using the current binding context. Esto suele ocurrir cuando se usa el método Assembly.LoadFrom y en escenarios de interoperabilidad COM.This most often occurs when the Assembly.LoadFrom method is used and in COM interop scenarios. Si un ensamblado usa el método LoadFrom para hacer referencia a otro ensamblado, la ubicación del ensamblado que realiza la llamada se considera una pista sobre dónde se encontrará el ensamblado al que se hace referencia.If an assembly uses the LoadFrom method to reference another assembly, the calling assembly's location is considered to be a hint about where to find the referenced assembly. Si se encuentra una coincidencia, se carga dicho ensamblado.If a match is found, that assembly is loaded. Si no se encuentra ninguna coincidencia, el tiempo de ejecución prosigue con la semántica de búsqueda y, a continuación, consulta a Windows Installer para proporcionar el ensamblado.If no match is found, the runtime continues with its search semantics and then queries the Windows Installer to provide the assembly. Si no se proporciona ningún ensamblado que coincida con la solicitud de enlace, se produce una excepción.If no assembly is provided that matches the binding request, an exception is thrown. Esta excepción es una TypeLoadException en código administrado si se hacía referencia a un tipo, o una FileNotFoundException si no se encontró un ensamblado que se estuviera cargando.This exception is a TypeLoadException in managed code if a type was referenced, or a FileNotFoundException if an assembly being loaded was not found.

Por ejemplo, si Assembly1 hace referencia a Assembly2 y Assembly1 se descargó desde http://www.code.microsoft.com/utils, dicha ubicación se considera una pista sobre dónde buscar Assembly2.dll.For example, if Assembly1 references Assembly2 and Assembly1 was downloaded from http://www.code.microsoft.com/utils, that location is considered to be a hint about where to find Assembly2.dll. Después, el runtime busca el ensamblado en http://www.code.microsoft.com/utils/Assembly2.dll y http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll.The runtime then probes for the assembly in http://www.code.microsoft.com/utils/Assembly2.dll and http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. Si no se encuentra Assembly2 en ninguna de estas ubicaciones, el tiempo de ejecución consulta a Windows Installer.If Assembly2 is not found at either of those locations, the runtime queries the Windows Installer.

Vea tambiénSee Also

Procedimientos recomendados para cargar ensambladosBest Practices for Assembly Loading
ImplementaciónDeployment