2013-05-16 9 views
6

perche il seguente pezzo di codice:comportamento DoCallBack CrossAppDomainDelegate per i delegati non statici

// Create a new application domain 
AppDomain ad = AppDomain.CreateDomain("New domain"); 

Worker work = new Worker(); 

// if Worker class is marked as 'MarshalByRefObject', this will run in current 
// appdomain. 
// if Worker class is NOT marked as 'MarshalByRefObject' and is marked as 
// 'Serializable', this will run in a new appdomain. 
ad.DoCallBack(work.PrintDomain); 
// or ad.DoCallBack(new CrossAppDomainDelegate(work.PrintDomain)); 

// But for static methods: 
// If ppp method is static, no marking is required and it will run in 
// a new AppDomain. 
ad.DoCallBack(Worker.ppp); 

come spiegare questo comportamento di DoCallBack?

  1. Perché il metodo non statico PrintDomain eseguito nel dominio corrente quando la classe è contrassegnata WorkerMarshalByRefObject?
  2. Perché il metodo non statico PrintDomain viene eseguito in un nuovo AppDomain quando la classe Worker è contrassegnata con Serializable?
  3. Perché non il metodo statico bisogno di alcun marcature?

risposta

6

Perché il metodo non statico PrintDomain eseguito nel dominio corrente quando la classe operaio è contrassegnata MarshalByRefObject?

Poiché questo è ciò che fa MBRO, crea un proxy per l'oggetto che è stato creato nell'appodominio principale. Che effettua il marshalling della chiamata dall'appodominio secondario all'appdomain che possiede l'oggetto, l'appdomain principale.

Perché il metodo non statico PrintDomain viene eseguito in un nuovo AppDomain quando la classe Worker è contrassegnata Serializable?

Poiché tale scenario non utilizza un proxy. L'oggetto stesso viene eseguito il marshalling dall'appadominio principale a quello secondario. Possibile perché lo hai segnato [Serializable]. La chiamata quindi viene eseguita nell'appodominio secondario.

Perché il metodo statico non richiede contrassegni?

Non è chiaro cosa intendi per "contrassegni", ma non è diverso per un metodo statico. Alcuni di codice con cui giocare, rimuovere il commento sulla classe di base per confrontare i due scenari:

using System; 

class Program { 
    static void Main(string[] args) { 
     var dom = AppDomain.CreateDomain("Test"); 
     var obj = new WorkerMbro(); 
     dom.DoCallBack(obj.PrintDomain); 
     dom.DoCallBack(obj.PrintDomainStatic); 
     Console.ReadLine(); 
    } 
} 
[Serializable] 
class WorkerMbro /* : MarshalByRefObject */ { 
    public void PrintDomain() { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
    } 
    public void PrintDomainStatic() { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
    } 
} 

uscita come ha scritto:

Test 
Test 

uscita con i commenti rimosso in modo che il proxy viene utilizzato:

ConsoleApplication1.vshost.exe 
ConsoleApplication1.vshost.exe 
+1

Il tuo metodo 'PrintDomainStatic' non è statico. Quando viene utilizzato il proxy ('MarshalByRefObject' non commentato) l'output è' TestApplication1.vshost.exe' – Troopers

Problemi correlati