2010-03-09 15 views
7

Voglio sapere se posso indicare in quale appodominio è stato creato un oggetto. Questo è per un test unitario ma anche utili conoscenze generali. Ho i seguenti pezzi di codice (questo è un esempio di codice per illustrazione).È possibile stabilire se un oggetto è in esecuzione in un AppDomain diverso?

public Foo Create() 
{ 
    AppDomainSetup appDomainSetup = 
     new AppDomainSet { ApplicationBase = @"z:\SomePath" } 

    AppDomain appDomain = 
        AppDomain.CreateDomain("DomainName", null, appDomainSetup); 

    return (Foo) appDomain.CreateInstanceAndUnwrap("MyAssembly", "MyClass"); 
} 

Ho poi chiamo

Foo myFoo = Create(); 

Quello che mi piacerebbe essere in grado di fare è scoprire quale metodo AppDomain su myFoo sarà chiamato in, per verificare che il metodo Create aveva effettivamente creato una nuova AppDomain. Mi rendo conto che posso aggiungere un metodo su come Foo

public class Foo 
{ 
    public string appDomainName 
    { 
     get { return AppDomain.CurrentDomain.FriendlyName; } 
    } 
} 

Questo mi avrebbe fornito il dominio di applicazione che Foo è in esecuzione in. Non credo che questa è una soluzione elegante solo per un test di unità. Sarebbe bello se qualcuno potesse aiutare a definire un metodo come.

public string GetAppDomainNameWithDotNetWitchcraft(Foo myFoo) 
{ 
    // Insert voodoo here. 
} 

EDIT: Grazie per le risposte e commenti. La domanda che ho posto è stata esaudita e i commenti mi hanno aiutato a capire dove stavo sbagliando. Quello che stavo davvero cercando di ottenere è testare che sia stato creato un nuovo AppDomain.

risposta

5

Bene, si può fare un po 'di speleologia tramite Remoting/Reflection, assumendo la propria esecuzione in piena fiducia. Si noti che si deve accedere a una proprietà privata, e questo presuppone che l'unica cosa che riesce a trovare è il servizio remoto a causa di attraversare i domini app:

var a = Create(); 
    if (System.Runtime.Remoting.RemotingServices.IsTransparentProxy(a)) 
    { 
     var c = System.Runtime.Remoting.RemotingServices.GetObjRefForProxy(a); 
     var ad = c.ChannelInfo.ChannelData[0]; 
     var propDomainId = ad.GetType().GetProperty("DomainID", BindingFlags.NonPublic | BindingFlags.Instance); 
     var DomainID = propDomainId.GetValue(ad,null); 
    } 

È quindi possibile confrontare l'ID di dominio per il proprio per sapere se è in il tuo dominio Intendiamoci, è improbabile che tu inserisca la dichiarazione if se è nel tuo dominio (prova a pensare a circostanze in cui avresti un proxy trasparente per un oggetto nel tuo dominio).

+0

Interessante. Non ci ho pensato. –

+0

Non mi dispiace un po 'di speleologia. È utile Anche se l'ho visto in un test unitario ha un odore di design :) – btlog

+0

@btlog - Sono curioso di sapere come capire se un oggetto si trova in un AppDomain diverso è un odore di design, ma scrivere un test unitario per assicurarsi che non sia (se capisci il mio significato)? –

Problemi correlati