Compartilhar via


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

Depois que 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 padrão do assembly.

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

Se você quiser executar o assembly começando em um ponto diferente, por exemplo, o ponto de entrada padrão, definir um novo tipo derivado de MarshalByRefObject na montagem remota. Em seguida, use CreateInstance para criar uma instância desse tipo em 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, fechá-lo. Localize o arquivo de HelloWorldRemote.exe na pasta de obj/Debug do seu projeto e copie o arquivo para a unidade 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)");
        }
    }
}

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 para ela.

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 da RemoteObject classe. Criando a instância faz com que o construtor para ser executado.

Dica

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 Add Reference 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 de 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 do C#

Domínios de aplicativos e assemblies

Programação com domínios de aplicativo

Outros recursos

Guia de programação de Visual Basic

Domínios de aplicativo

Programando com Assemblies e domínios de aplicativo