Leer en inglés

Compartir a través de


AppDomainSetup.DynamicBase Propiedad

Definición

Obtiene o establece el directorio base donde está ubicado el directorio de los archivos dinámicamente generados.

C#
public string DynamicBase { get; set; }

Valor de propiedad

Directorio donde se encuentra la propiedad DynamicDirectory. Nota: El valor devuelto de esta propiedad es diferente del valor asignado.

Implementaciones

Excepciones

Esta propiedad no se puede establecer porque el nombre de la aplicación en el dominio de aplicación es null.

Ejemplos

En el ejemplo siguiente se muestra cómo usar la DynamicBase propiedad para establecer la ruta de acceso que un dominio de aplicación sondea al cargar ensamblados dinámicos.

En el ejemplo se crea un AppDomainSetup objeto y se establece su ApplicationName propiedad en "Example" y su DynamicBase propiedad en "C:\DynamicAssemblyDir". A continuación, en el ejemplo se muestra la DynamicBase propiedad para mostrar que el código hash del nombre de la aplicación se ha anexado como subdirectorio de la ruta de acceso asignada originalmente.

Nota

El directorio base de este ejemplo está pensado para estar fuera de la ruta de acceso de sondeo de la aplicación de ejemplo. Asegúrese de compilar el ejemplo en otra ubicación. Elimine el directorio base y todos sus subdirectorios cada vez que ejecute el ejemplo.

En el ejemplo se crea un nuevo dominio de aplicación mediante el AppDomainSetup objeto . A continuación, en el ejemplo se crea el directorio dinámico si aún no existe. Aunque en el ejemplo se usa la propiedad del dominio de AppDomain.DynamicDirectory aplicación para obtener el nombre del directorio dinámico, podría crear el directorio de antemano mediante la concatenación de la ruta de acceso original, el código hash del nombre de la aplicación y el nombre de la aplicación.

El ejemplo tiene un GenerateDynamicAssembly método que emite un ensamblado denominado DynamicHelloWorld.dll y lo almacena en el directorio dinámico del nuevo dominio de aplicación. El ensamblado dinámico contiene un tipo, HelloWorld, que tiene un método estático (Shared método en Visual Basic) denominado HelloFromAD. Al llamar a este método, se muestra el nombre del dominio de aplicación.

La Example clase deriva de MarshalByRefObject, por lo que el ejemplo puede crear una instancia de la clase en el nuevo dominio de aplicación y llamar a su Test método. El Test método carga el ensamblado dinámico por su nombre para mostrar y llama al método estático HelloFromAD .

Puede mostrar que el directorio dinámico se busca después de las rutas de acceso de sondeo normales escribiendo código para un ensamblado denominado DynamicHelloWorld.dll y compilarlo en el mismo directorio que en este ejemplo. El ensamblado debe tener una clase denominada HelloWorld con un método estático denominado HelloFromAD. Este método no tiene que tener la misma funcionalidad que la del ejemplo; simplemente puede mostrar una cadena en la consola. El ensamblado también debe tener un AssemblyVersionAttribute atributo que establezca su versión en 1.0.0.0. Al ejecutar el ejemplo, se busca el ensamblado compilado en el directorio actual antes de buscar en el directorio dinámico.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

public class AddDynamicBaseSnippet : MarshalByRefObject
{
   static void Main()
   {
      // Prepare to create a new application domain.
      AppDomainSetup setup = new AppDomainSetup();

      // Set the application name before setting the dynamic base.
      setup.ApplicationName = "Example";

      // Set the location of the base directory where assembly resolution
      // probes for dynamic assemblies. Note that the hash code of the
      // application name is concatenated to the base directory name you
      // supply.
      setup.DynamicBase = "C:\\DynamicAssemblyDir";
      Console.WriteLine("DynamicBase is set to '{0}'.", setup.DynamicBase);

      AppDomain ad = AppDomain.CreateDomain("MyDomain", null, setup);

      // The dynamic directory name is the dynamic base concatenated with
      // the application name: <DynamicBase>\<hash code>\<ApplicationName>
      string dynamicDir = ad.DynamicDirectory;
      Console.WriteLine("Dynamic directory is '{0}'.", dynamicDir);

      // The AssemblyBuilder won't create this directory automatically.
      if (!System.IO.Directory.Exists(dynamicDir))
      {
         Console.WriteLine("Creating the dynamic directory.");
         System.IO.Directory.CreateDirectory(dynamicDir);
      }

      // Generate a dynamic assembly and store it in the dynamic
      // directory.
      GenerateDynamicAssembly(dynamicDir);

      // Create an instance of the Example class in the application domain,
      // and call its Test method to load the dynamic assembly and use it.
      AddDynamicBaseSnippet ex = (AddDynamicBaseSnippet) ad.CreateInstanceAndUnwrap(
         typeof(AddDynamicBaseSnippet).Assembly.FullName, "Example");
      ex.Test();
   }

   public void Test()
   {
      Assembly dynAssem = Assembly.Load(
         "DynamicHelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

      Type myType = dynAssem.GetType("HelloWorld");
      myType.InvokeMember("HelloFromAD", BindingFlags.Public |
         BindingFlags.Static | BindingFlags.InvokeMethod,
         Type.DefaultBinder, null, null);
   }

   private static void GenerateDynamicAssembly(string location)
   {
      // Define the dynamic assembly and the module. There is only one
      // module in this assembly. Note that the call to DefineDynamicAssembly
      // specifies the location where the assembly will be saved. The
      // assembly version is 1.0.0.0.
      //
      AssemblyName asmName = new AssemblyName("DynamicHelloWorld");
      asmName.Version = new Version("1.0.0.0");

      AssemblyBuilder ab =
         AppDomain.CurrentDomain.DefineDynamicAssembly(
            asmName, AssemblyBuilderAccess.Save, location);

      String moduleName = asmName.Name + ".exe";
      ModuleBuilder mb = ab.DefineDynamicModule(asmName.Name, moduleName);

      // Define the "HelloWorld" type, with one static method.
      TypeBuilder tb = mb.DefineType("HelloWorld", TypeAttributes.Public);
      MethodBuilder hello = tb.DefineMethod("HelloFromAD",
         MethodAttributes.Public | MethodAttributes.Static, null, null);

      // The method displays a message that contains the name of the application
      // domain where the method is executed.
      ILGenerator il = hello.GetILGenerator();
      il.Emit(OpCodes.Ldstr, "Hello from '{0}'!");
      il.Emit(OpCodes.Call, typeof(AppDomain).GetProperty("CurrentDomain").GetGetMethod());
      il.Emit(OpCodes.Call, typeof(AppDomain).GetProperty("FriendlyName").GetGetMethod());
      il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
                             new Type[] { typeof(String), typeof(String) }));
      il.Emit(OpCodes.Ret);

      // Complete the HelloWorld type and save the assembly. The assembly
      // is placed in the location specified by DefineDynamicAssembly.
      Type myType = tb.CreateType();
      ab.Save(moduleName);
   }
}

/* This example produces output similar to the following:

DynamicBase is set to 'C:\DynamicAssemblyDir\5e4a7545'.
Dynamic directory is 'C:\DynamicAssemblyDir\5e4a7545\Example'.
Creating the dynamic directory.
Hello from 'MyDomain'!
 */

Comentarios

Utilice esta propiedad para establecer el directorio base donde se ubicará el directorio dinámico del nuevo dominio de aplicación. Cuando el código del nuevo dominio de aplicación carga un ensamblado, la resolución de ensamblados busca primero en las rutas de acceso de sondeo normales. Si no encuentra el ensamblado, busca en el directorio dinámico, que devuelve la AppDomain.DynamicDirectory propiedad . Los ensamblados dinámicos que se cargarán y ejecutarán en el nuevo dominio de aplicación se pueden colocar allí.

Cuando se asigna una ruta de acceso a la DynamicBase propiedad, se agrega un subdirectorio adicional; el nombre de este subdirectorio es el código hash del valor asignado a la ApplicationName propiedad . Por lo tanto, el directorio base devuelto por esta propiedad siempre es diferente del valor asignado.

Importante

La asignación de un valor a esta propiedad no crea ningún directorio. El código que los usa deben crear o comprobar los directorios.

El directorio dinámico es un subdirectorio de DynamicBase. Su nombre simple es el valor devuelto por la ApplicationName propiedad , por lo que su formato esel nombre de la aplicaciónhash\de ruta de acceso\ original.

Se aplica a

Producto Versiones
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1