Выполнение кода в другом домене приложения (C# и Visual Basic)
После загрузки сборки в домен приложения можно выполнить содержащийся в этой сборке код. Наиболее простой способ загрузки сборки заключается в использовании AssemblyLoad, что позволяет загрузить сборку в текущий домен приложения и начать выполнение кода в точке входа сборки по умолчанию.
Для загрузки сборки в другой домен приложения используется ExecuteAssembly или ExecuteAssemblyByName, или одна из других перегруженных версий этих методов.
Чтобы выполнить сборку с точки, отличной от точки входа по умолчанию, определите новый тип, производный от MarshalByRefObject в удаленной сборке. Затем используйте CreateInstance для создания экземпляра такого типа в своем приложении.
Следующий код, создает сборку, состоящую из одного пространства имен и двух классов. Вставьте код в консольное приложение Visual Studio с именем HelloWorldRemote. Постройте или запустите решение, а затем закройте его. Найдите файл HelloWorldRemote.exe в папке obj/Debug своего проекта и скопируйте этот файл на свой диск C:.
' This module contains code to be called.
Module HelloWorldRemote
Class RemoteObject
Inherits System.MarshalByRefObject
Sub RemoteObject()
System.Console.WriteLine("Hello, World! (RemoteObject Constructor)")
End Sub
End Class
Sub Main()
System.Console.WriteLine("Hello, World! (Main method)")
End Sub
End Module
// 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. Создание экземпляра приводит к выполнению конструктора объекта.
' Load the assembly into the current appdomain:
Dim newAssembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom("c:\HelloWorldRemote.exe")
' Instantiate RemoteObject:
newAssembly.CreateInstance("HelloWorldRemote.RemoteObject")
// 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. Создание экземпляра приводит к выполнению конструктора.
Примечание
Дополнительные сведения о недостатках использования Assembly.LoadFrom см. в подразделе "Заметки" описания метода Assembly.LoadFrom(String).
Dim NewAppDomain As System.AppDomain = 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")
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. В C# добавьте директиву using HelloWorldRemote;; в Visual Basic добавьте инструкцию Imports HelloWorldRemote. После этого воспользуйтесь типом RemoteObject в программе, чтобы объявить экземпляр объекта RemoteObject, как показано в примере ниже.
' This code creates an instance of RemoteObject,
' assuming HelloWorldRemote has been added as a reference:
Dim o As HelloWorldRemote.RemoteObject = New HelloWorldRemote.RemoteObject()
// This code creates an instance of RemoteObject,
// assuming HelloWorldRemote has been added as a reference:
HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();
См. также
Ссылки
Домены приложений (C# и Visual Basic)
Основные понятия
Руководство по программированию на C#
Программирование с использованием доменов приложений
Другие ресурсы
Руководство по программированию на Visual Basic
Программирование с использованием доменов приложений и сборок