2012-03-13 21 views
5

Tôi muốn đặt câu hỏi để nhận ra sự khác biệt giữa AppDomain và Activator, tôi đã tải dll của mình qua appdomain.CreateInstance. Nhưng tôi nhận ra rằng có nhiều phương pháp để tạo ra cá thể. Vì vậy, khi nào hoặc ở đâu tôi chọn phương pháp này? example1:sự khác nhau giữa AppDomain.CreateInstance và Activator.CreateInstance là gì?

// Use the file name to load the assembly into the current 
    // application domain. 
    Assembly a = Assembly.Load("example"); 
    // Get the type to use. 
    Type myType = a.GetType("Example"); 
    // Get the method to call. 
    MethodInfo myMethod = myType.GetMethod("MethodA"); 
    // Create an instance. 
    object obj = Activator.CreateInstance(myType); 
    // Execute the method. 
    myMethod.Invoke(obj, null); 

Ví dụ 2:

public WsdlClassParser CreateWsdlClassParser() 
{ 
    this.CreateAppDomain(null); 

    string AssemblyPath = Assembly.GetExecutingAssembly().Location; 
    WsdlClassParser parser = null; 
    try 
    {     
     parser = (WsdlClassParser) this.LocalAppDomain.CreateInstanceFrom(AssemblyPath, 
              typeof(Westwind.WebServices.WsdlClassParser).FullName).Unwrap() ;     
    } 
    catch (Exception ex) 
    { 
     this.ErrorMessage = ex.Message; 
    }       
    return parser; 
} 

Example3:

private static void InstantiateMyTypeSucceed(AppDomain domain) 
{ 
    try 
    { 
     string asmname = Assembly.GetCallingAssembly().FullName; 
     domain.CreateInstance(asmname, "MyType"); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(); 
     Console.WriteLine(e.Message); 
    } 
} 

bạn có thể giải thích tại sao tôi cần phương pháp nhiều hơn hoặc sự khác biệt là gì?

Trả lời

2

Từ mã nguồn sscli2.0, có vẻ như các cuộc gọi phương thức "CreateInstance" trong lớp AppDomain luôn ủy quyền cuộc gọi đến Activator.

Mục đích duy nhất của (gần như tĩnh) Activator lớp là để "Tạo" trường hợp của các tầng lớp khác nhau, trong khi AppDomain được giới thiệu cho khá khác nhau (và có lẽ tham vọng hơn) mục đích, ví dụ:

  1. Đơn vị cách ly ứng dụng trọng lượng nhẹ;
  2. Tối ưu hóa mức tiêu thụ bộ nhớ vì AppDomains có thể được Unloaded.
  3. ...

Ví dụ thứ nhất và thứ 3 rất đơn giản, giống như lưu ý zmbq. Tôi đoán ví dụ thứ 2 của bạn là từ số post này, nơi tác giả đã cho biết cách xóa một proxy lỗi thời bằng cách sử dụng AppDomain.

2

Thứ nhất tạo một thể hiện kiểu Example từ assembly 'example', và gọi MethodA trên đó.

Người thứ ba tạo ra một thể hiện của MyType trong một khác nhau AppDomain

Tôi không chắc chắn về thứ hai, tôi không biết this là gì, nhưng nó dường như để tạo ra một lớp trong hiện tại miền ứng dụng - tức là, nó tương tự như tên miền đầu tiên.