2010-04-15 10 views

risposta

35

Si dovrebbe probabilmente essere notato che la creazione di AppDomains solo per ottenere intorno a qualcosa che può essere fissato con una stringa costante è probabilmente il modo più sbagliato per farlo . Se si sta cercando di fare la stessa cosa come il collegamento si è preso nota, si può solo fare questo:

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

ricorsivo Entry Point: 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"); 
} 

campione rapida utilizzando un non statico secondaria punto di ingresso e 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

Grazie. C'è una ragione per preferire un approccio all'altro? –

+0

Il primo probabilmente sarebbe più pulito. Ti consentirebbe di utilizzare un punto di ingresso standard invece di dover creare un oggetto che avrebbe bisogno di essere eseguito il marshalling attraverso le appdomain. Il secondo approccio è più tipico.Ma è normalmente utilizzato per i plug-in e non il principale punto di accesso dell'app. –

+1

C'è anche un metodo '.ExecuteAssembly (...)' sull'oggetto 'AppDomain' che è possibile fornire il percorso a un altro assembly che contiene un punto di ingresso. Ciò potrebbe consentire un design leggermente più pulito, ma richiederebbe almeno due assiemi. –

4

è necessario:

1) Creare un'istanza oggetto AppDomainSetup e popolarlo con le informazioni di configurazione che si desidera per il tuo dominio

2) Crea il tuo nuovo dominio utilizzando AppDomain.CreateDoman metodo. L'istanza AppDomainSetup con parametri di configurazione viene passata al metodo CreateDomain.

3) Creare un'istanza del proprio oggetto nel nuovo dominio utilizzando il metodo CreateInstanceAndUnwrap sull'oggetto dominio. Questo metodo prende nome tipografico dell'oggetto che si desidera creare e restituisce un proxy remoto che può essere utilizzato nel proprio dominio principale per comunicare con l'oggetto creato nel nuovo

Una volta che si è in grado di chiamare questi metodi, è possibile chiamare i metodi in l'altro dominio tramite il proxy. Puoi anche scaricare il dominio dopo aver finito e ricaricarlo di nuovo.

Questo topic in MSDN aiuto deve esempio abbastanza dettagliata di che cosa avete bisogno

+2

Questo è più o meno quello che ho visto negli esempi che ho visto altrove, ma non fornisce alcuna delle informazioni che mi mancano ancora. Ho appena chiamato Application.Run (nuovo MyForm)? Devo estrarre tutto il codice di avvio esistente dal mio metodo Main, trasferirlo in un nuovo metodo e chiamarlo per avviare la mia app? Nessuna delle precedenti perché sono ancora più confuso di quanto penso di essere? –

+1

L'oggetto a cui si sta tentando di ottenere il proxy deve essere "MarshalByRefObject" oppure tenterà semplicemente di serializzare una copia nell'appDomain originale. –

+0

@ Matthew Whited - hai ragione, ho dimenticato di menzionare che – mfeingold

Problemi correlati