2013-05-16 12 views
6

Bitte betrachten Sie das folgende Stück Code:DoCallBack CrossAppDomainDelegate Verhalten für nicht-statisch Delegierten

// 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); 

Wie erklären wir das Verhalten von DoCallBack?

  1. Warum ist die nicht-statische Methode PrintDomain in der aktuellen Domäne ausgeführt, wenn die Worker Klasse MarshalByRefObject markiert?
  2. Warum wird die nicht statische Methode PrintDomain in einer neuen AppDomain ausgeführt, wenn die Worker-Klasse mit Serializable markiert ist?
  3. Warum benötigt die statische Methode keine Markierungen?

Antwort

6

Warum ist die nicht-statische PrintDomain Methode in der aktuellen Domäne ausgeführt, wenn die Arbeiterklasse MarshalByRefObject markiert?

Da dies MBRO tut, erstellt es einen Proxy für das Objekt, das Sie in Ihrer primären Anwendungsdomäne erstellt haben. Das leitet den Aufruf von der sekundären App-Domäne an die App-Domäne, die das Objekt besitzt, die primäre App-Domäne.

Warum wird die nicht statische Methode PrintDomain in einer neuen AppDomain ausgeführt, wenn die Worker-Klasse als serialisierbar gekennzeichnet ist?

Da dieses Szenario verwendet nicht einen Proxy verwenden. Das Objekt selbst wird von der primären zur sekundären Anwendungsdomäne gemarshallt. Möglich, weil Sie es [Serializable] markiert haben. Der Aufruf wird daher in der sekundären Anwendungsdomäne ausgeführt.

Warum braucht die statische Methode keine Markierungen?

Es ist nicht klar, was Sie mit "Markierungen" meinen, aber es ist nicht anders für eine statische Methode. Einige Code zu spielen, entfernen Sie den Kommentar auf der Basisklasse, die beiden Szenarien vergleichen:

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); 
    } 
} 

Ausgabe als posted:

Test 
Test 

Ausgabe mit den entfernt Kommentaren, so dass der Proxy verwendet wird:

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

Ihre Methode 'PrintDomainStatic' ist nicht statisch. Wenn der Proxy verwendet wird ('MarshalByRefObject' unkommentiert), lautet die Ausgabe' ConsoleApplication1.vshost.exe Test' – Troopers