2010-04-15 12 views

Respuesta

35

Probablemente debe tenerse en cuenta que la creación de AppDomains sólo para obtener en torno a algo que puede ser fijado con una cadena constante es probablemente la manera incorrecta de hacerlo . Si usted está tratando de hacer lo mismo que el enlace que ha anotado, sólo podía hacer esto:

var configFile = Assembly.GetExecutingAssembly().Location + ".config"; 
if (!File.Exists(configFile)) 
    throw new Exception("do your worst!"); 

entrada recursiva Punto: o)

static void Main(string[] args) 
{ 
    if (AppDomain.CurrentDomain.IsDefaultAppDomain()) 
    { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 

     var currentAssembly = Assembly.GetExecutingAssembly(); 
     var otherDomain = AppDomain.CreateDomain("other domain"); 
     var ret = otherDomain.ExecuteAssemblyByName(currentAssembly.FullName, args); 

     Environment.ExitCode = ret; 
     return; 
    } 

    Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
    Console.WriteLine("Hello"); 
} 

muestra rápida utilizando un no estático secundaria punto de entrada y MarshalByRefObject ...

class Program 
{ 
    static AppDomain otherDomain; 

    static void Main(string[] args) 
    { 
     otherDomain = AppDomain.CreateDomain("other domain"); 

     var otherType = typeof(OtherProgram); 
     var obj = otherDomain.CreateInstanceAndUnwrap(
           otherType.Assembly.FullName, 
           otherType.FullName) as OtherProgram; 

     args = new[] { "hello", "world" }; 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
     obj.Main(args); 
    } 
} 

public class OtherProgram : MarshalByRefObject 
{ 
    public void Main(string[] args) 
    { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
     foreach (var item in args) 
      Console.WriteLine(item); 
    } 
} 
+1

Gracias. ¿Hay alguna razón para preferir un acercamiento al otro? –

+0

El primero probablemente sería más limpio. Le permitiría usar un punto de entrada estándar en lugar de tener que crear un objeto que tendría que ser ordenado a través de los dominios de aplicaciones. El segundo enfoque es más típico.Pero normalmente se usa para complementos y no como el principal punto de entrada de la aplicación. –

+1

También hay un método '.ExecuteAssembly (...)' en el objeto 'AppDomain' que puede proporcionar la ruta a otro ensamblado que contiene un punto de entrada. Eso podría permitir un diseño ligeramente más limpio, pero requeriría al menos dos conjuntos. –

4

es necesario:

1) Crea una instancia de objeto AppDomainSetup y rellenarla con la información de configuración que desee para su dominio

2) Crear su nuevo dominio mediante AppDomain.CreateDoman método. La instancia de AppDomainSetup con parámetros de configuración se pasa al método CreateDomain.

3) Cree una instancia de su objeto en el nuevo dominio utilizando el método CreateInstanceAndUnwrap en el objeto de dominio. Este método toma typename del objeto que desea crear y devuelve un proxy remoto que puede usar en su dominio principal para comunicarse con el objeto creado en el nuevo

Una vez que haya completado estos 3 pasos, puede llamar a los métodos en el otro dominio a través del proxy. También puede descargar el dominio después de que haya terminado y volver a cargarlo.

Este topic en MSDN ayuda tiene ejemplo bastante detallada de lo que necesita

+2

Eso es más o menos lo que he visto en los ejemplos que he visto en otros lugares, pero no proporciona ninguna de la información que aún me falta. ¿Acabo de llamar a Application.Run (new MyForm)? ¿Corto todo el código de inicio existente de mi método Principal, lo meto en un nuevo método y lo llamo para iniciar mi aplicación? Ninguno de los anteriores porque estoy aún más confundido de lo que creo que estoy? –

+1

El objeto del que intenta obtener el proxy debe ser 'MarshalByRefObject' o de lo contrario solo tratará de serializar una copia de regreso al AppDomain original. –

+0

@Matthew Whited: tienes razón, olvidé mencionar que – mfeingold

Cuestiones relacionadas