2010-03-09 28 views
7

Tôi muốn biết nếu tôi có thể cho biết appdomain một đối tượng đã được tạo ra. Đây là một bài kiểm tra đơn vị nhưng cũng có kiến ​​thức chung hữu ích. Tôi có các đoạn mã sau đây (đây là mã ví dụ minh họa).Có thể biết một đối tượng có đang chạy trong một AppDomain khác không?

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

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

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

sau đó tôi gọi

Foo myFoo = Create(); 

Những gì tôi muốn để có thể làm là tìm hiểu những gì phương pháp AppDomain trên myFoo sẽ được gọi trong, để kiểm tra rằng Create phương pháp đã thực sự tạo ra một mới AppDomain. Tôi nhận ra rằng tôi có thể thêm một phương pháp trên Foo như

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

Điều này sẽ cung cấp cho tôi appdomain rằng Foo đang chạy. Tôi không nghĩ rằng đây là một giải pháp thanh lịch chỉ dành riêng cho một bài kiểm tra đơn vị. Nó sẽ là tuyệt vời nếu ai đó có thể giúp xác định một phương pháp như thế nào.

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

EDIT: Cảm ơn phản hồi và nhận xét. Câu hỏi mà tôi đã hỏi đã được trả lời và những bình luận đã giúp tôi nhận ra nơi tôi đã đi sai. Những gì tôi thực sự đã cố gắng đạt được là để kiểm tra rằng một AppDomain mới được tạo ra.

Trả lời

5

Vâng, bạn có thể thực hiện một chút Spelunking qua Remoting/Reflection, giả sử bạn đang chạy hoàn toàn tin cậy. Lưu ý rằng bạn phải truy cập vào một tài sản cá nhân, và điều này giả định rằng điều duy nhất nó có thể tìm được truy cập từ xa do vượt qua lĩnh vực ứng dụng:

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

Sau đó bạn có thể so sánh rằng ID miền của riêng bạn để biết nếu nó trong tên miền của bạn. Xin lưu ý, bạn không thể nhập câu lệnh if nếu số trong miền của bạn (cố gắng nghĩ đến các trường hợp bạn có proxy trong suốt đối tượng trong miền của riêng bạn).

+0

Thú vị. Tôi không nghĩ về điều đó. –

+0

Tôi không bận tâm chút nào về việc chơi game. Điều đó rất hữu ích. Mặc dù nếu tôi thấy rằng trong một bài kiểm tra đơn vị nó có mùi thiết kế :) – btlog

+0

@btlog - Tôi tò mò về cách tìm hiểu xem một đối tượng có nằm trong một AppDomain khác không là mùi thiết kế, nhưng viết một bài kiểm tra đơn vị để đảm bảo nó là không 't (nếu bạn hiểu ý nghĩa của tôi)? –

Các vấn đề liên quan