2010-03-09 4 views
7

Ich möchte wissen, ob ich sagen kann, welche appdomain ein Objekt erstellt wurde. Dies ist für einen Komponententest aber auch nützliches allgemeines Wissen. Ich habe die folgenden Teile des Codes (das ist Beispielcode für die Illustration).Kann festgestellt werden, ob ein Objekt in einer anderen AppDomain ausgeführt wird?

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

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

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

Ich nenne dann

Foo myFoo = Create(); 

Was würde ich zu tun, um der Lage sein mag, ist, herauszufinden, was AppDomain Methode auf myFoo in aufgerufen wird, zu testen, ob die Methode Create geschaffen hatte tatsächlich eine neue Anwendungsdomäne Ich weiß, dass ich eine Methode auf Foo wie

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

Das würde mir die Appdomain vor, dass Foo in laufen. Ich glaube nicht, das eine elegante Lösung ist nur für einen Komponententest. Es wäre großartig, wenn jemand helfen könnte, eine Methode zu definieren.

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

EDIT: Danke für die Antworten und Kommentare. Die Frage, die ich gestellt habe, wurde beantwortet und die Kommentare haben mir geholfen, zu erkennen, wo ich falsch liege. Was ich wirklich erreichen wollte, ist zu testen, dass eine neue AppDomain erstellt wird.

Antwort

5

Nun, Sie können ein wenig Spelunking über Remoting/Reflection tun, vorausgesetzt, Sie laufen in vollem Vertrauen. Beachten Sie, dass Sie eine private Eigenschaft zuzugreifen, und dies setzt voraus, dass das einzige, was sie finden können, ist Remoting aufgrund Anwendungsdomänen überqueren:

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

können Sie vergleichen dann die Domain-ID zu Ihrer eigenen wissen, ob es in Deine Domain. Wohlgemerkt ist es unwahrscheinlich, dass Sie die if-Anweisung eingeben, wenn sie in Ihrer Domäne ist (versuchen, an Umstände zu denken, bei denen Sie einen transparenten Proxy für ein Objekt in Ihrer eigenen Domäne haben würden).

+0

Interessant. Daran habe ich nicht gedacht. –

+0

Ich habe nichts gegen ein bisschen Höhlenforschung. Das ist nützlich. Obwohl, wenn ich sah, dass in einem Unit-Test hat es einen Design-Geruch :) – btlog

+0

@btlog - Ich bin neugierig, wie ergründen, ob ein Objekt in einer anderen AppDomain ist ein Design-Geruch, aber einen Unit-Test schreiben, um sicherzustellen, dass es Isn ist 't (wenn Sie meine Bedeutung bekommen)? –