Ejecutar código en otro dominio de aplicación (Guía de programación de C#)

Actualización: noviembre 2007

Una vez que se carga un ensamblado en un dominio de aplicación, se puede ejecutar el código que contiene. La forma más sencilla de hacerlo es utilizar AssemblyLoad, que cargará el ensamblado en el dominio de aplicación actual, y comenzar la ejecución del código en el punto de entrada predeterminado del ensamblado.

Si desea cargar el ensamblado en otro dominio de la aplicación, utilice ExecuteAssembly o ExecuteAssemblyByName, o una de las otras versiones sobrecargadas de estos métodos.

Si desea ejecutar el otro ensamblado a partir de un punto de entrada distinto del predeterminado, defina un nuevo tipo en el ensamblado remoto, que deriva de MarshalByRefObject. A continuación, utilice CreateInstance para crear una instancia de ese tipo en la aplicación.

Observe el siguiente archivo que crea un ensamblado que consiste en un espacio de nombres único y dos clases. Suponga que este ensamblado se ha generado y se ha guardado en la unidad C con el nombre HelloWorldRemote.exe.

// This namespace contains code to be called.
namespace HelloWorldRemote
{
    public class RemoteObject : System.MarshalByRefObject
    {
        public RemoteObject()
        {
            System.Console.WriteLine("Hello, World! (RemoteObject Constructor)");
        }
    }
    class Program
    {
        static void Main()
        {
            System.Console.WriteLine("Hello, World! (Main method)");
        }
    }
}

Para tener acceso al código desde otra aplicación, puede cargar el ensamblado en el dominio de aplicación actual o crear un nuevo dominio de aplicación y cargarle el ensamblado. Si carga el ensamblado en el dominio de aplicación actual con Assembly.LoadFrom, puede utilizar Assembly.CreateInstance para crear una instancia de la clase RemoteObject, lo que hace que se ejecute el constructor del objeto.

static void Main()
{
    // Load the assembly into the current appdomain:
    System.Reflection.Assembly newAssembly = System.Reflection.Assembly.LoadFrom(@"c:\HelloWorldRemote.exe");

    // Instantiate RemoteObject:
    newAssembly.CreateInstance("HelloWorldRemote.RemoteObject");
}

Cuando cargue el ensamblado en un dominio de aplicación independiente, utilice AppDomain.ExecuteAssembly para tener acceso al punto de entrada predeterminado o AppDomain.CreateInstance para crear una instancia de la clase RemoteObject. La creación de la instancia hace que se ejecute el constructor.

static void Main()
{
    System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain");

    // Load the assembly and call the default entry point:
    NewAppDomain.ExecuteAssembly(@"c:\HelloWorldRemote.exe");

    // Create an instance of RemoteObject:
    NewAppDomain.CreateInstanceFrom(@"c:\HelloWorldRemote.exe", "HelloWorldRemote.RemoteObject");
}

Si no desea cargar el ensamblado mediante programación, utilice Agregar referencia del Explorador de soluciones para especificar el ensamblado HelloWorldRemote.exe. A continuación, agregue una directiva using HelloWorldRemote; al bloque using de la aplicación y utilice el tipo RemoteObject en el programa para declarar una instancia del objeto RemoteObject, de la forma siguiente:

static void Main()
{
    // This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference:
    HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();
}

Vea también

Conceptos

Guía de programación de C#

Información general sobre dominios de aplicación

Dominios de aplicación y ensamblados

Programar con dominios de aplicación

Referencia

Dominios de aplicación (Guía de programación de C#)

Otros recursos

Dominios de aplicación

Programar con dominios de aplicación y ensamblados