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



Домены приложений обладают следующими свойствами:

· Прежде чем сборка может быть выполнена, она должна быть загружена в домен приложения. Дополнительные сведения см. в разделе Сборки и глобальный кэш сборок.

· Сбои в одном домене приложения не влияют на код, выполняющийся в другом домене приложения.

· Можно прекратить выполнение и выгрузить код отдельных приложений, не останавливая процесс целиком. Выгрузить отдельные сборки или типы невозможно, домены приложений нужно выгружать целиком.

 


Executing Code in Another Application Domain

Once an assembly has been loaded into an application domain, the code it contains can be executed. The simplest way to do this is to use AssemblyLoad which will load the assembly into the current application domain, and begin running the code at the assembly's default entry point.

If you want to load the assembly into another application domain, use ExecuteAssembly or ExecuteAssemblyByName, or one of the other overloaded versions of these methods.

If you want to execute the other assembly starting other than at the default entry point, define a new type in the remote assembly, deriving from MarshalByRefObject. Then use CreateInstance to create an instance of that type in your application.

Consider the following file, which creates an assembly consisting of a single namespace and two classes. Assume this assembly has been built, and is stored on drive C with the name 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)");    } } }

Выполнение кода в другом домене приложения

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

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

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

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

 

 

ß------


To access the code from another application, you can either load the assembly into the current application domain or create a new application domain and load the assembly into it. If you load the assembly into the current application domain with Assembly.LoadFrom, you can use Assembly.CreateInstance to instantiate an instance of the RemoteObject class, which causes the object constructor to be executed.

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

When loading the assembly into a separate application domain, use AppDomain.ExecuteAssembly to access the default entry point or AppDomain.CreateInstance to create an instance of the RemoteObject class. Creating the instance causes the constructor to be executed.

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

If you do not want to load the assembly programmatically, use Add Reference from the Solution Explorer to specify the assembly HelloWorldRemote.exe. Then, add a using HelloWorldRemote; directive to the using block of your application, and use the RemoteObject type in your program to declare an instance of the RemoteObject object, like this:

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

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

ß-----

 

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

ß-----

 

 

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

ß---


Дата добавления: 2019-03-09; просмотров: 215; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!