Procedimientos recomendados para cargar ensambladosBest Practices for Assembly Loading

En este artículo se abordan formas de evitar problemas de identidad de tipos que pueden causar errores como InvalidCastException o MissingMethodException, entre otros.This article discusses ways to avoid problems of type identity that can lead to InvalidCastException, MissingMethodException, and other errors. En él se ofrecen las siguientes recomendaciones:The article discusses the following recommendations:

La primera recomendación, comprenda las ventajas y las desventajas de los contextos de carga, proporciona información general para las demás recomendaciones, ya que todas dependen del conocimiento de los contextos de carga.The first recommendation, understand the advantages and disadvantages of load contexts, provides background information for the other recommendations, because they all depend on a knowledge of load contexts.

Comprenda las ventajas y las desventajas de los contextos de cargaUnderstand the Advantages and Disadvantages of Load Contexts

En un dominio de aplicación, los ensamblados se pueden cargar en uno de entre tres contextos o sin contexto:Within an application domain, assemblies can be loaded into one of three contexts, or they can be loaded without context:

  • El contexto de carga predeterminado contiene ensamblados que se encuentran al sondear la caché global de ensamblados, el almacén de ensamblado de host si el runtime está hospedado (por ejemplo, en SQL Server) y el ApplicationBase y PrivateBinPath del dominio de aplicación.The default load context contains assemblies found by probing the global assembly cache, the host assembly store if the runtime is hosted (for example, in SQL Server), and the ApplicationBase and PrivateBinPath of the application domain. La mayoría de las sobrecargas del método Load carga ensamblados en este contexto.Most overloads of the Load method load assemblies into this context.

  • El contexto de origen de carga contiene ensamblados que se cargan desde ubicaciones en las que no busca el cargador.The load-from context contains assemblies that are loaded from locations that are not searched by the loader. Por ejemplo, los complementos podrían instalarse en un directorio que no esté bajo la ruta de acceso de la aplicación.For example, add-ins might be installed in a directory that is not under the application path. Assembly.LoadFrom, AppDomain.CreateInstanceFrom y AppDomain.ExecuteAssembly son ejemplos de métodos que cargan por ruta de acceso.Assembly.LoadFrom, AppDomain.CreateInstanceFrom, and AppDomain.ExecuteAssembly are examples of methods that load by path.

  • El contexto de solo reflexión contiene ensamblados cargados con los métodos ReflectionOnlyLoad y ReflectionOnlyLoadFrom.The reflection-only context contains assemblies loaded with the ReflectionOnlyLoad and ReflectionOnlyLoadFrom methods. No se puede ejecutar código en este contexto, por lo que no se trata aquí.Code in this context cannot be executed, so it is not discussed here. Para más información, vea How to: Load Assemblies into the Reflection-Only Context (Cómo: Cargar ensamblados en el contexto de solo reflexión).For more information, see How to: Load Assemblies into the Reflection-Only Context.

  • Si ha generado un ensamblado dinámico transitorio mediante la reflexión de la emisión, el ensamblado no está en ningún contexto.If you generated a transient dynamic assembly by using reflection emit, the assembly is not in any context. Además, la mayoría de los ensamblados que se carga mediante el método LoadFile lo hace sin contexto, mientras que los ensamblados que se cargan desde matrices de bytes lo hacen sin contexto a menos que su identidad (una vez aplicada la directiva) establezca que están en la caché global de ensamblados.In addition, most assemblies that are loaded by using the LoadFile method are loaded without context, and assemblies that are loaded from byte arrays are loaded without context unless their identity (after policy is applied) establishes that they are in the global assembly cache.

Los contextos de ejecución tienen ventajas y desventajas, como se explica en las secciones siguientes.The execution contexts have advantages and disadvantages, as discussed in the following sections.

Contexto de carga predeterminadoDefault Load Context

Cuando los ensamblados se cargan en el contexto de carga predeterminado, sus dependencias se cargan automáticamente.When assemblies are loaded into the default load context, their dependencies are loaded automatically. Las dependencias que se cargan en el contexto de carga predeterminado se encuentran automáticamente para los ensamblados en el contexto de carga predeterminado o en el contexto de origen de carga.Dependencies that are loaded into the default load context are found automatically for assemblies in the default load context or the load-from context. La carga por identidad del ensamblado aumenta la estabilidad de las aplicaciones al garantizar que no se usen versiones desconocidas de ensamblados (vea la sección Evite los enlaces en nombres de ensamblado parciales).Loading by assembly identity increases the stability of applications by ensuring that unknown versions of assemblies are not used (see the Avoid Binding on Partial Assembly Names section).

El empleo del contexto de carga predeterminado tiene las siguientes desventajas:Using the default load context has the following disadvantages:

  • Las dependencias que se cargan en otros contextos no están disponibles.Dependencies that are loaded into other contexts are not available.

  • No es posible cargar ensamblados desde ubicaciones situadas fuera de la ruta de acceso de sondeo en el contexto de carga predeterminado.You cannot load assemblies from locations outside the probing path into the default load context.

Contexto de origen de cargaLoad-From Context

El contexto de origen de carga permite cargar un ensamblado desde una ruta de acceso que no está en la ruta de acceso de la aplicación y que, por tanto, no está incluida en el sondeo.The load-from context lets you load an assembly from a path that is not under the application path, and therefore is not included in probing. Permite encontrar y cargar dependencias desde esa ruta de acceso porque el contexto mantiene la información de la ruta de acceso.It enables dependencies to be located and loaded from that path, because the path information is maintained by the context. Además, los ensamblados de este contexto pueden usar dependencias que se cargan en el contexto de carga predeterminado.In addition, assemblies in this context can use dependencies that are loaded into the default load context.

La carga de ensamblados mediante el método Assembly.LoadFrom, o alguno de los demás métodos que cargan por ruta de acceso, tiene las siguientes desventajas:Loading assemblies by using the Assembly.LoadFrom method, or one of the other methods that load by path, has the following disadvantages:

  • Si hay un ensamblado con la misma identidad ya cargado, LoadFrom devuelve el ensamblado cargado aunque se haya especificado otra ruta de acceso.If an assembly with the same identity is already loaded, LoadFrom returns the loaded assembly even if a different path was specified.

  • Si se carga un ensamblado con LoadFrom y después un ensamblado del contexto de carga predeterminado intenta cargar el mismo ensamblado por nombre para mostrar, se produce un error en el intento de carga.If an assembly is loaded with LoadFrom, and later an assembly in the default load context tries to load the same assembly by display name, the load attempt fails. Esto puede ocurrir cuando se deserializa un ensamblado.This can occur when an assembly is deserialized.

  • Si un ensamblado se carga con LoadFrom y la ruta de acceso de sondeo incluye un ensamblado con la misma identidad pero en otra ubicación, puede producirse una InvalidCastException, MissingMethodException u otro comportamiento inesperado.If an assembly is loaded with LoadFrom, and the probing path includes an assembly with the same identity but in a different location, an InvalidCastException, MissingMethodException, or other unexpected behavior can occur.

  • LoadFrom exige FileIOPermissionAccess.Read y FileIOPermissionAccess.PathDiscovery, o WebPermission, en la ruta de acceso especificada.LoadFrom demands FileIOPermissionAccess.Read and FileIOPermissionAccess.PathDiscovery, or WebPermission, on the specified path.

  • Si existe una imagen nativa del ensamblado, no se usa.If a native image exists for the assembly, it is not used.

  • No se puede cargar el ensamblado con dominio neutro.The assembly cannot be loaded as domain-neutral.

  • En las versiones 1.0 y 1.1 de .NET Framework no se aplica la directiva.In the .NET Framework versions 1.0 and 1.1, policy is not applied.

Sin contextoNo Context

La carga sin contexto es la única opción para los ensamblados transitorios generados con la emisión de la reflexión.Loading without context is the only option for transient assemblies that are generated with reflection emit. La carga sin contexto es la única manera de cargar varios ensamblados con la misma identidad en un dominio de aplicación.Loading without context is the only way to load multiple assemblies that have the same identity into one application domain. Se evita el costo del sondeo.The cost of probing is avoided.

Los ensamblados que se cargan desde matrices de bytes lo hacen sin contexto a menos que la identidad del ensamblado, que se establece al aplicar la directiva, coincide con la identidad de un ensamblado de la caché global de ensamblados; en ese caso, el ensamblado se carga desde la caché global de ensamblados.Assemblies that are loaded from byte arrays are loaded without context unless the identity of the assembly, which is established when policy is applied, matches the identity of an assembly in the global assembly cache; in that case, the assembly is loaded from the global assembly cache.

La carga de ensamblados sin contexto presenta las siguientes desventajas:Loading assemblies without context has the following disadvantages:

  • No es posible enlazar otros ensamblados a ensamblados cargados sin contexto, a menos que controle el evento AppDomain.AssemblyResolve.Other assemblies cannot bind to assemblies that are loaded without context, unless you handle the AppDomain.AssemblyResolve event.

  • Las dependencias no se cargan automáticamente.Dependencies are not loaded automatically. Puede cargarlas previamente sin contexto, cargarlas previamente en el contexto de carga predeterminado o cargarlas mediante el control del evento AppDomain.AssemblyResolve.You can preload them without context, preload them into the default load context, or load them by handling the AppDomain.AssemblyResolve event.

  • La carga de varios ensamblados con la misma identidad sin contexto puede provocar problemas de identidad de tipos similares a los que produce la carga de ensamblados con la misma identidad en varios contextos.Loading multiple assemblies with the same identity without context can cause type identity problems similar to those caused by loading assemblies with the same identity into multiple contexts. Vea Evite la carga de un ensamblado en varios contextos.See Avoid Loading an Assembly into Multiple Contexts.

  • Si existe una imagen nativa del ensamblado, no se usa.If a native image exists for the assembly, it is not used.

  • No se puede cargar el ensamblado con dominio neutro.The assembly cannot be loaded as domain-neutral.

  • En las versiones 1.0 y 1.1 de .NET Framework no se aplica la directiva.In the .NET Framework versions 1.0 and 1.1, policy is not applied.

Evite los enlaces en nombres de ensamblado parcialesAvoid Binding on Partial Assembly Names

Los enlaces de nombre parcial se producen cuando se especifica solo parte del nombre para mostrar del ensamblado (FullName) al cargar un ensamblado.Partial name binding occurs when you specify only part of the assembly display name (FullName) when you load an assembly. Por ejemplo, puede llamar al método Assembly.Load con solo el nombre simple del ensamblado, omitiendo la versión, la referencia cultural y el token de clave pública.For example, you might call the Assembly.Load method with only the simple name of the assembly, omitting the version, culture, and public key token. O bien puede llamar al método Assembly.LoadWithPartialName, que primero llama al método Assembly.Load y, si así no logra encontrar el ensamblado, busca en la caché global de ensamblados y carga la última versión disponible del ensamblado.Or you might call the Assembly.LoadWithPartialName method, which first calls the Assembly.Load method and, if that fails to locate the assembly, searches the global assembly cache and loads the latest available version of the assembly.

Los enlaces de nombre parcial pueden producir muchos problemas, incluidos los siguientes:Partial name binding can cause many problems, including the following:

  • El método Assembly.LoadWithPartialName puede cargar otro ensamblado con el mismo nombre simple.The Assembly.LoadWithPartialName method might load a different assembly with the same simple name. Por ejemplo, dos aplicaciones podrían instalar dos ensamblados completamente diferentes con el nombre simple GraphicsLibrary en la caché global de ensamblados.For example, two applications might install two completely different assemblies that both have the simple name GraphicsLibrary into the global assembly cache.

  • El ensamblado cargado realmente podría no ser compatible con versiones anteriores.The assembly that is actually loaded might not be backward-compatible. Por ejemplo, si no se especifica la versión, se podría cargar una versión muy posterior a aquella en que se escribiera originalmente el programa.For example, not specifying the version might result in the loading of a much later version than the version your program was originally written to use. Los cambios en la versión más reciente podrían provocar errores en la aplicación.Changes in the later version might cause errors in your application.

  • El ensamblado cargado realmente podría no ser compatible con versiones posteriores.The assembly that is actually loaded might not be forward-compatible. Por ejemplo, podría haber compilado y probado la aplicación con la versión más reciente de un ensamblado, pero el enlace parcial podría cargar una versión muy anterior que no tuviera características que usa la aplicación.For example, you might have built and tested your application with the latest version of an assembly, but partial binding might load a much earlier version that lacks features your application uses.

  • Al instalar nuevas aplicaciones se podrían interrumpir aplicaciones existentes.Installing new applications can break existing applications. Una aplicación que usa el método LoadWithPartialName puede interrumpirse al instalar una versión no compatible más reciente de un ensamblado compartido.An application that uses the LoadWithPartialName method can be broken by installing a newer, incompatible version of a shared assembly.

  • Se puede producir una carga de dependencias inesperada.Unexpected dependency loading can occur. Si carga dos ensamblados que comparten una dependencia, el cargarlos con enlace parcial podría dar lugar a que uno usara un componente con el que no se hubiera compilado ni probado.It you load two assemblies that share a dependency, loading them with partial binding might result in one assembly using a component that it was not built or tested with.

Debido a los problemas que puede ocasionar, el método LoadWithPartialName se ha marcado como obsoleto.Because of the problems it can cause, the LoadWithPartialName method has been marked obsolete. Se recomienda usar el método Assembly.Load en su lugar y especificar nombres para mostrar de ensamblado completos.We recommend that you use the Assembly.Load method instead, and specify full assembly display names. Vea Comprenda las ventajas y las desventajas de los contextos de carga y Considere la posibilidad de cambiar al contexto de carga predeterminado.See Understand the Advantages and Disadvantages of Load Contexts and Consider Switching to the Default Load Context.

Si quiere usar el método LoadWithPartialName porque facilita la carga de ensamblados, tenga en cuenta que un error de la aplicación con un mensaje de error que identifique el ensamblado que falta es probable que proporcione una mejor experiencia de usuario que el empleo automático de una versión desconocida del ensamblado, que podría dar lugar a un comportamiento impredecible y a vulnerabilidades de seguridad.If you want to use the LoadWithPartialName method because it makes assembly loading easy, consider that having your application fail with an error message that identifies the missing assembly is likely to provide a better user experience than automatically using an unknown version of the assembly, which might cause unpredictable behavior and security holes.

Evite la carga de un ensamblado en varios contextosAvoid Loading an Assembly into Multiple Contexts

La carga de un ensamblado en varios contextos puede ocasionar problemas de identidad de tipos.Loading an assembly into multiple contexts can cause type identity problems. Si se carga el mismo tipo desde el mismo ensamblado en dos contextos diferentes, es como si se hubieran cargado dos tipos diferentes con el mismo nombre.If the same type is loaded from the same assembly into two different contexts, it is as if two different types with the same name had been loaded. Si intenta convertir un tipo en el otro, se produce una InvalidCastException con el confuso mensaje de que no se puede convertir el tipo MyType en el tipo MyType.An InvalidCastException is thrown if you try to cast one type to the other, with the confusing message that type MyType cannot be cast to type MyType.

Por ejemplo, imagine que se declara la interfaz ICommunicate en un ensamblado denominado Utility al que hace referencia el programa y, además, otros ensamblados que carga el programa.For example, suppose that the ICommunicate interface is declared in an assembly named Utility, which is referenced by your program and also by other assemblies that your program loads. Estos otros ensamblados contienen tipos que implementan la interfaz ICommunicate, lo que permite al programa usarlos.These other assemblies contain types that implement the ICommunicate interface, allowing your program to use them.

Ahora imagine qué ocurre al ejecutar el programa.Now consider what happens when your program is run. Los ensamblados a los que hace referencia el programa se cargan en el contexto de carga predeterminado.Assemblies that are referenced by your program are loaded into the default load context. Si carga un ensamblado de destino por su identidad, con el método Load, estará en el contexto de carga predeterminado, igual que sus dependencias.If you load a target assembly by its identity, using the Load method, it will be in the default load context, and so will its dependencies. Tanto el programa como el ensamblado de destino usarán el mismo ensamblado Utility.Both your program and the target assembly will use the same Utility assembly.

Pero imagine que carga el ensamblado de destino por su ruta de acceso, con el método LoadFile.However, suppose you load the target assembly by its file path, using the LoadFile method. El ensamblado se carga sin ningún contexto, así que sus dependencias no se cargan automáticamente.The assembly is loaded without any context, so its dependencies are not automatically loaded. Podría tener un controlador para que el evento AppDomain.AssemblyResolve proporcionara la dependencia y este podría cargar el ensamblado Utility sin contexto con el método LoadFile.You might have a handler for the AppDomain.AssemblyResolve event to supply the dependency, and it might load the Utility assembly with no context by using the LoadFile method. Al crear una instancia de un tipo incluido en el ensamblado de destino e intentar asignarla a una variable de tipo ICommunicate, se produce una InvalidCastException porque el runtime considera que las interfaces ICommunicate de las dos copias del ensamblado Utility son tipos distintos.Now when you create an instance of a type that is contained in the target assembly and try to assign it to a variable of type ICommunicate, an InvalidCastException is thrown because the runtime considers the ICommunicate interfaces in the two copies of the Utility assembly to be different types.

Hay muchos otros escenarios en los que se puede cargar un ensamblado en varios contextos.There are many other scenarios in which an assembly can be loaded into multiple contexts. El mejor enfoque es evitar los conflictos mediante la reubicación del ensamblado de destino en la ruta de acceso de la aplicación y el empleo del método Load con el nombre para mostrar completo.The best approach is to avoid conflicts by relocating the target assembly in your application path and using the Load method with the full display name. Luego se carga el ensamblado en el contexto de carga predeterminado y ambos ensamblados usan el mismo ensamblado Utility.The assembly is then loaded into the default load context, and both assemblies use the same Utility assembly.

Si el ensamblado de destino debe permanecer fuera de la ruta de acceso de la aplicación, puede usar el método LoadFrom para cargarlo en el contexto de origen de carga.If the target assembly must remain outside your application path, you can use the LoadFrom method to load it into the load-from context. Si el ensamblado de destino se ha compilado con una referencia al ensamblado Utility de la aplicación, usará el ensamblado Utility que la aplicación haya cargado en el contexto de carga predeterminado.If the target assembly was compiled with a reference to your application's Utility assembly, it will use the Utility assembly that your application has loaded into the default load context. Tenga en cuenta que pueden producirse problemas si el ensamblado de destino tiene una dependencia en una copia del ensamblado Utility ubicado fuera de la ruta de acceso de la aplicación.Note that problems can occur if the target assembly has a dependency on a copy of the Utility assembly located outside your application path. Si se carga ese ensamblado en el contexto de origen de carga antes de que la aplicación cargue el ensamblado Utility, se produce un error en la carga de la aplicación.If that assembly is loaded into the load-from context before your application loads the Utility assembly, your application's load will fail.

En la sección Considere la posibilidad de cambiar al contexto de carga predeterminado se explican alternativas al uso de cargas de ruta de acceso de archivo como LoadFile y LoadFrom.The Consider Switching to the Default Load Context section discusses alternatives to using file path loads such as LoadFile and LoadFrom.

Evite la carga de varias versiones de un ensamblado en el mismo contextoAvoid Loading Multiple Versions of an Assembly into the Same Context

La carga de varias versiones de un ensamblado en un contexto de carga puede producir problemas de identidad de tipos.Loading multiple versions of an assembly into one load context can cause type identity problems. Si se carga el mismo tipo desde dos versiones del mismo ensamblado, es como si se hubieran cargado dos tipos diferentes con el mismo nombre.If the same type is loaded from two versions of the same assembly, it is as if two different types with the same name had been loaded. Si intenta convertir un tipo en el otro, se produce una InvalidCastException con el confuso mensaje de que no se puede convertir el tipo MyType en el tipo MyType.An InvalidCastException is thrown if you try to cast one type to the other, with the confusing message that type MyType cannot be cast to type MyType.

Por ejemplo, el programa podría cargar una versión del ensamblado Utility directamente y luego podría cargar otro ensamblado que cargara una versión diferente del ensamblado Utility.For example, your program might load one version of the Utility assembly directly, and later it might load another assembly that loads a different version of the Utility assembly. O bien un error de codificación podría hacer que dos rutas de acceso de código diferentes de la aplicación cargaran versiones distintas de un ensamblado.Or a coding error might cause two different code paths in your application to load different versions of an assembly.

En el contexto de carga predeterminado, este problema puede producirse cuando se usa el método Assembly.Load y se especifican nombres para mostrar de ensamblado completos que incluyen números de versión diferentes.In the default load context, this problem can occur when you use the Assembly.Load method and specify complete assembly display names that include different version numbers. En el caso de los ensamblados que se cargan sin contexto, el problema puede deberse al uso del método Assembly.LoadFile para cargar el mismo ensamblado desde rutas de acceso diferentes.For assemblies that are loaded without context, the problem can be caused by using the Assembly.LoadFile method to load the same assembly from different paths. El runtime considera que dos ensamblados que se cargan desde rutas de acceso diferentes son ensamblados distintos, aunque sus identidades sean iguales.The runtime considers two assemblies that are loaded from different paths to be different assemblies, even if their identities are the same.

Además de los problemas de identidad de tipos, varias versiones de un ensamblado pueden producir una MissingMethodException si un tipo cargado desde una versión del ensamblado se pasa a código que espera ese tipo desde otra versión.In addition to type identity problems, multiple versions of an assembly can cause a MissingMethodException if a type that is loaded from one version of the assembly is passed to code that expects that type from a different version. Por ejemplo, el código podría esperar un método que se ha agregado a la versión más reciente.For example, the code might expect a method that was added to the later version.

Si el comportamiento del tipo ha cambiado entre versiones, se pueden producir errores más sutiles.More subtle errors can occur if the behavior of the type changed between versions. Por ejemplo, un método podría producir una excepción imprevista o devolver un valor inesperado.For example, a method might throw an unexpected exception or return an unexpected value.

Revise el código atentamente para garantizar que solo se cargue una versión de un ensamblado.Carefully review your code to ensure that only one version of an assembly is loaded. Puede usar el método AppDomain.GetAssemblies para determinar qué ensamblados se cargan en un momento dado.You can use the AppDomain.GetAssemblies method to determine which assemblies are loaded at any given time.

Considere la posibilidad de cambiar al contexto de carga predeterminadoConsider Switching to the Default Load Context

Examine los patrones de carga e implementación de ensamblados de la aplicación.Examine your application's assembly loading and deployment patterns. ¿Puede eliminar ensamblados cargados desde matrices de bytes?Can you eliminate assemblies that are loaded from byte arrays? ¿Puede mover ensamblados a la ruta de acceso de sondeo?Can you move assemblies into the probing path? Si los ensamblados se encuentran en la caché global de ensamblados o en la ruta de acceso de sondeo del dominio de la aplicación (es decir, su ApplicationBase y PrivateBinPath), puede cargar el ensamblado por su identidad.If assemblies are located in the global assembly cache or in the application domain's probing path (that is, its ApplicationBase and PrivateBinPath), you can load the assembly by its identity.

Si no es posible colocar todos los ensamblados en la ruta de acceso de sondeo, considere alternativas como usar el modelo de complementos de .NET Framework, colocar los ensamblados en la caché global de ensamblados o crear dominios de aplicación.If it is not possible to put all your assemblies in the probing path, consider alternatives such as using the .NET Framework add-in model, placing assemblies into the global assembly cache, or creating application domains.

Considere la posibilidad de usar el modelo de complementos de .NET FrameworkConsider Using the .NET Framework Add-In Model

Si está usando el contexto de origen de carga para implementar complementos, que normalmente no están instalados en la base de la aplicación, use el modelo de complementos de .NET Framework.If you are using the load-from context to implement add-ins, which typically are not installed in the application base, use the .NET Framework add-in model. Este modelo proporciona aislamiento en el nivel del proceso o el dominio de la aplicación sin exigirle que administre los dominios de aplicación usted mismo.This model provides isolation at the application domain or process level, without requiring you to manage application domains yourself. Para más información sobre el modelo de complementos, vea Complementos y extensibilidad.For information about the add-in model, see Add-ins and Extensibility.

Considere la posibilidad de usar la caché global de ensambladosConsider Using the Global Assembly Cache

Coloque los ensamblados en la caché global de ensamblados para beneficiarse de una ruta de acceso de ensamblado compartida que esté fuera de la base de la aplicación, sin perder las ventajas del contexto de carga predeterminado ni asumir las desventajas de los otros contextos.Place assemblies in the global assembly cache to get the benefit of a shared assembly path that is outside the application base, without losing the advantages of the default load context or taking on the disadvantages of the other contexts.

Considere la posibilidad de usar dominios de aplicaciónConsider Using Application Domains

Si determina que algunos de los ensamblados no se pueden implementar en la ruta de acceso de sondeo de la aplicación, considere la posibilidad de crear un nuevo dominio de aplicación para esos ensamblados.If you determine that some of your assemblies cannot be deployed in the application's probing path, consider creating a new application domain for those assemblies. Use un AppDomainSetup para crear el nuevo dominio de aplicación y la propiedad AppDomainSetup.ApplicationBase para especificar la ruta de acceso que contiene los ensamblados que quiere cargar.Use an AppDomainSetup to create the new application domain, and use the AppDomainSetup.ApplicationBase property to specify the path that contains the assemblies you want to load. Si tiene varios directorios para sondear, puede establecer ApplicationBase en un directorio raíz y usar la propiedad AppDomainSetup.PrivateBinPath para identificar los subdirectorios de sondeo.If you have multiple directories to probe, you can set the ApplicationBase to a root directory and use the AppDomainSetup.PrivateBinPath property to identify the subdirectories to probe. Como alternativa, puede crear varios dominios de aplicación y establecer la ApplicationBase de cada dominio de aplicación en la ruta de acceso adecuada para sus ensamblados.Alternatively, you can create multiple application domains and set the ApplicationBase of each application domain to the appropriate path for its assemblies.

Tenga en cuenta que puede usar el método Assembly.LoadFrom para cargar estos ensamblados.Note that you can use the Assembly.LoadFrom method to load these assemblies. Dado que ahora se encuentran en la ruta de acceso de sondeo, se cargarán en el contexto de carga predeterminado en lugar de hacerlo en el contexto de origen de carga.Because they are now in the probing path, they will be loaded into the default load context instead of the load-from context. Pero se recomienda cambiar al método Assembly.Load y proporcionar nombres para mostrar de ensamblado completos para asegurarse de que siempre se usen versiones correctas.However, we recommend that you switch to the Assembly.Load method and supply full assembly display names to ensure that correct versions are always used.

Vea tambiénSee also