2009-08-09 8 views
11

Tôi muốn biết, nếu tôi có một biến, ví dụ, một chuỗi, làm thế nào để vượt qua giá trị của nó vào miền ứng dụng mới của tôi:Làm thế nào để chuyển biến từ một miền ứng dụng khác

static string _str; 

static void Main(string[] args) { 
    _str = "abc"; 
    AppDomain domain = AppDomain.CreateDomain("Domain666"); 
    domain.DoCallBack(MyNewAppDomainMethod); 
    AppDomain.Unload(domain); 
    Console.WriteLine("Finished"); 
    Console.ReadKey(); 
} 

static void MyNewAppDomainMethod() { 
    Console.WriteLine(_str); //want this to print "abc" 
} 

Cảm ơn

Trả lời

11

Sử dụng một trong các biến thể của AppDomain.CreateDomain nhận đối số AppDomainSetup. Trong đối tượng AppDomainSetup, đặt thành viên AppDomainInitializerArguments vào mảng chuỗi mà bạn muốn chuyển sang miền ứng dụng mới.

Xem mã mẫu tại http://msdn.microsoft.com/en-us/library/system.appdomainsetup.appdomaininitializerarguments.aspx.

Với mã trong câu hỏi, sự thay đổi có thể trông giống như (không kiểm tra):

static voide Main(string[] args) { 
    _str = "abc"; 

    AppDomainSetup setup = new AppDomainSetup(); 
    setup.AppDomainInitializer = new AppDomainInitializer(MyNewAppDomainMethod); 
    setup.AppDomainInitializerArguments = new string[] { _str }; 

    AppDomain domain = AppDomain.CreateDomain(
     "Domain666", 
     new Evidence(AppDomain.CurrentDomain.Evidence), 
     setup); 

    Console.WriteLine("Finished"); 
    Console.ReadKey(); 
} 

static void MyNewAppDomainMethod(string[] args) { 
    ... 
} 
+1

Cảm ơn. Bây giờ tôi muốn biết làm thế nào để có được thông tin trở lại appdomain chính của tôi. Đó là, trả lại một đối tượng. Cảm ơn! –

+0

Và một câu hỏi khác. Tôi thấy AppDomainInitializerArguments chỉ chấp nhận một mảng các chuỗi. Trong trường hợp này tôi thực sự chỉ muốn dây, vì vậy không có vấn đề gì, nhưng nếu tôi muốn loại dữ liệu khác thì sao? Không có gì để làm về nó? –

+0

Miền ứng dụng không chia sẻ một không gian bộ nhớ đối tượng và do đó, việc truyền các đối tượng xung quanh yêu cầu tuần tự hóa một số loại. Để trả về một đối tượng, bạn có thể DoCallBack trên appdomain ban đầu, nếu bạn có thể có được bàn tay của bạn trên nó (tôi không thấy một cách dễ dàng để làm như vậy mặc dù). Ngoài ra, bạn có thể thiết lập một số hình thức kênh liên kênh khác giữa các miền ứng dụng, ví dụ: một ống có tên. –

4

Tôi biết rằng đây là một chủ đề cũ nhưng có lẽ điều này sẽ giúp những người khác đang nghiên cứu đề tài này.

Trong this article, tác giả đề xuất sử dụng miền ứng dụng SetDataGetData các phương thức trao đổi cơ bản các đối tượng dữ liệu hỗ trợ đối tượng so khớp theo giá trị hoặc so sánh theo tham chiếu.

17

Phát biểu cả hai yêu cầu đầu tiên và thứ hai của bạn (đi qua một giá trị và lấy giá trị khác sau), đây là một giải pháp khá đơn giản:

static void Main(string[] args) 
{ 
    AppDomain domain = AppDomain.CreateDomain("Domain666"); 
    domain.SetData("str", "abc"); 
    domain.DoCallBack(MyNewAppDomainMethod); 
    string str = domain.GetData("str") as string; 
    Debug.Assert(str == "def"); 
} 

static void MyNewAppDomainMethod() 
{ 
    string str = AppDomain.CurrentDomain.GetData("str") as string; 
    Debug.Assert(str == "abc"); 
    AppDomain.CurrentDomain.SetData("str", "def"); 
} 
+0

Cảm ơn, đây là câu trả lời hay nhất cho tôi! – bas