[C#] Thực thi assembly ở miền ứng dụng khác

? Bạn cần thực thi một assembly ở một miền ứng dụng khác với miền ứng dụng hiện hành.
» Gọi phương thức ExecuteAssembly của đối tượng AppDomain đại diện cho miền ứng dụng, và chỉ định tên của assembly cần thực thi.
Nếu bạn có một assembly khả-thực-thi và muốn nạp để thực thi nó trong một miền ứng dụng, phương thức ExecuteAssembly sẽ giúp bạn. Phương thức ExecuteAssembly có bốn dạng thức khác nhau. Dạng thức đơn giản nhất chỉ nhận vào một kiểu string chứa tên của assembly cần thực thi; bạn có thể chỉ định một file cục bộ hay một URL. Một dạng thức khác cho phép bạn chỉ định chứng cứ (evidence) cho assembly và các đối số để truyền đến điểm nhập của assembly (tương đương với các đối số dòng lệnh).

Phương thức ExecuteAssembly nạp assembly được chỉ định và thực thi phương thức được định nghĩa trong siêu dữ liệu là điểm nhập của assembly (thường là phương thức Main). Nếu assembly được chỉ định không có khả năng thực thi, ExecuteAssembly sẽ ném ngoại lệ System.Runtime.InteropServices.COMException. Bộ thực thi không thực thi assembly trong một tiểu trình mới, vì thế quyền kiểm soát sẽ không trả về cho đến khi quá trình thực thi của assembly kết thúc. Do ExecuteAssembly nạp một assembly bằng tên riêng phần (chỉ có tên file), CLR sẽ không dùng GAC hay probing để tìm assembly.

Ví dụ dưới đây trình bày cách sử dụng phương thức ExecuteAssembly để nạp và thực thi một assembly. Lớp ExecuteAssemblyExample tạo một AppDomain và thực thi chính nó trong AppDomain bằng phương thức ExecuteAssembly. Kết quả là có hai bản sao của ExecuteAssemblyExample được nạp vào hai miền ứng dụng khác nhau.

Code:

using System;

public class ExecuteAssemblyExample {

public static void Main(string[] args) {

        // Nếu assembly đang thực thi trong một AppDomain
        // có tên thân thiện là “NewAppDomain”
        // thì không tạo AppDomain mới. Điều này sẽ
        // tránh một vòng lặp vô tận tạo AppDomain.
        if (AppDomain.CurrentDomain.FriendlyName != “NewAppDomain”) {

            // Tạo miền ứng dụng mới có tên là “NewAppDomain”.
            AppDomain domain = AppDomain.CreateDomain(“NewAppDomain”);

            // Thực thi assembly này trong AppDomain mới và
            // truyền mảng các đối số dòng lệnh.
            domain.ExecuteAssembly(“ExecuteAssemblyExample.exe”,
                null, args);

        }

        // Hiển thị các đối số dòng lệnh lên màn hình
        // cùng với tên thân thiện của AppDomain.
        foreach (string s in args) {

            Console.WriteLine(AppDomain.CurrentDomain.FriendlyName +
                ” : ” + s);
        }
    }
}