Выполнение кода в другом домене приложения (Руководство по программированию в C#)

Обновлен: Ноябрь 2007

После загрузки сборки в домен приложения можно выполнить содержащийся в ней код. Наиболее простой способ выполнения кода заключается в использовании AssemblyLoad, что позволяет загрузить сборку в текущий домен приложения и начать выполнение кода в точке входа сборки по умолчанию.

Для загрузки сборки в другой домен приложения используется ExecuteAssembly или ExecuteAssemblyByName, или одна из других перегруженных версий этих методов.

Чтобы выполнить другую сборку с точки, отличной от точки входа по умолчанию, определите новый тип в удаленной сборке, производной от MarshalByRefObject. Затем используйте CreateInstance для создания экземпляра такого типа в своем приложении.

Рассмотрите следующий файл, создающий сборку, состоящую из одного пространства имен и двух классов. Допустим, что эта сборка была построена и сохранена на диске C под именем HelloWorldRemote.exe.

// This namespace contains code to be called.
namespace HelloWorldRemote
{
    public class RemoteObject : System.MarshalByRefObject
    {
        public RemoteObject()
        {
            System.Console.WriteLine("Hello, World! (RemoteObject Constructor)");
        }
    }
    class Program
    {
        static void Main()
        {
            System.Console.WriteLine("Hello, World! (Main method)");
        }
    }
}

Чтобы получить доступ к коду из другого приложения, можно либо загрузить сборку в текущий домен приложения, или создать новый домен приложения и загрузить сборку в него. Если сборка загружена в текущий домен приложения Assembly.LoadFrom, то можно использовать Assembly.CreateInstance для создания экземпляра класса RemoteObject, что приводит к выполнению конструктора объекта.

static void Main()
{
    // Load the assembly into the current appdomain:
    System.Reflection.Assembly newAssembly = System.Reflection.Assembly.LoadFrom(@"c:\HelloWorldRemote.exe");

    // Instantiate RemoteObject:
    newAssembly.CreateInstance("HelloWorldRemote.RemoteObject");
}

При загрузке сборки в отдельный домен приложения для доступа к точке входа по умолчанию используйте AppDomain.ExecuteAssembly, а для создания экземпляра класса RemoteObject используйте AppDomain.CreateInstance. Создание экземпляра приводит к выполнению конструктора.

static void Main()
{
    System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain");

    // Load the assembly and call the default entry point:
    NewAppDomain.ExecuteAssembly(@"c:\HelloWorldRemote.exe");

    // Create an instance of RemoteObject:
    NewAppDomain.CreateInstanceFrom(@"c:\HelloWorldRemote.exe", "HelloWorldRemote.RemoteObject");
}

Если сборку не требуется загружать программными средствами, используйте команду Добавить ссылку в Обозревателе решений, чтобы указать сборку HelloWorldRemote.exe. Затем, добавьте директиву using HelloWorldRemote; к блоку using приложения, и используйте тип RemoteObject в программе для объявления экземпляра объекта RemoteObject (см. ниже):

static void Main()
{
    // This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference:
    HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();
}

См. также

Основные понятия

Руководство по программированию в C#

Общие сведения о доменах приложений

Домены приложений и сборки

Программирование с использованием доменов приложений

Ссылки

Домены приложений (руководство по программированию в C#)

Другие ресурсы

Домены приложений

Программирование с использованием доменов приложений и сборок