Executar código em outro domínio de aplicativo (C# e Visual Basic)

Depois de um assembly foi carregado em um domínio de aplicativo, o código que o assembly contém pode ser executado. A maneira mais simples para carregar um assembly é usar AssemblyLoad, que carrega o assembly no domínio de aplicativo atual e começa a executar o código no ponto de entrada do padrão. o conjunto

Se você deseja carregar o assembly em outro domínio de aplicativo, use ExecuteAssembly ou ExecuteAssemblyByName, ou uma da outra sobrecarregado versões dessas métodos.

Se você deseja executar o assembly começando em um ponto diferente, por exemplo, o ponto de entrada padrão, definir um novo tipo derivado de MarshalByRefObject no assembly remoto. Em seguida, use CreateInstance para criar uma instância desse tipo no seu aplicativo.

O código a seguir cria um assembly que consiste em um único namespace e duas classes. Cole o código em um aplicativo de console Visual Studio chamado HelloWorldRemote, construir ou executar a solução e, em seguida, feche-o. Localizar o arquivo HelloWorldRemote.exe na pasta de obj/depurar do projeto e copie o arquivo para sua unidade c: unidade.

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

Para acessar o código de outro aplicativo, você pode carregar o assembly no domínio de aplicativo atual, ou você pode criar um novo domínio de aplicativo e carregar o assembly nela.

Para carregar o assembly no domínio de aplicativo atual usando Assembly.LoadFrom, você pode usar Assembly.CreateInstance para criar uma instância da RemoteObject classe. A instanciação faz com que o construtor do objeto a ser executado.

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

Ao carregar o assembly em um domínio de aplicativo separado, use AppDomain.ExecuteAssembly para acessar o ponto de entrada padrão, ou AppDomain.CreateInstance para criar uma instância do RemoteObject classe. Criando a instância faz com que o construtor para ser executado.

ObservaçãoObservação

Para obter informações sobre as desvantagens do uso de Assembly.LoadFrom, consulte a seção de comentários de 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");

Se não desejar carregar o assembly programaticamente, use Adicionar referência de da Solution Explorer para especificar o assembly HelloWorldRemote.exe. No C#, adicione um using HelloWorldRemote; diretiva; no Visual Basic, adicione um Imports HelloWorldRemote instrução. Em seguida, use o RemoteObject tipo no seu programa para declarar uma instância da RemoteObject o objeto, conforme mostrado no exemplo a seguir.

' 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();

Consulte também

Referência

Domínios de aplicativo (C# e Visual Basic)

Conceitos

Guia de Programação C#

Domínios de Aplicativo

Domínios de Aplicativos e Assemblies

Programação com domínios de aplicativo

Outros recursos

Guia de programação Visual Basic 

Programação com Domínios de Aplicativos e Assemblies