Executing Code in Another Application Domain (C# and Visual Basic)

Once an assembly has been loaded into an application domain, the code that the assembly contains can be executed. The simplest way to load an assembly is to use AssemblyLoad, which loads the assembly into the current application domain and begins to run 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 assembly starting at a point other than the default entry point, define a new type that is derived from MarshalByRefObject in the remote assembly. Then use CreateInstance to create an instance of that type in your application.

The following code creates an assembly consisting of a single namespace and two classes. Paste the code into a Visual Studio console application named HelloWorldRemote, Build or run the solution, and then close it. Find the HelloWorldRemote.exe file in your project's obj/Debug folder, and copy the file to your C: drive.


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


To access the code from another application, you can either load the assembly into the current application domain, or you can create a new application domain and load the assembly into it.

To load the assembly into the current application domain by using Assembly.LoadFrom, you can use Assembly.CreateInstance to instantiate an instance of the RemoteObject class. The instantiation causes the object constructor to be executed.


// 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.

NoteNote

For information about the disadvantages of using Assembly.LoadFrom, see the Remarks section of Assembly.LoadFrom(String).


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. In C#, add a using HelloWorldRemote; directive; in Visual Basic, add an Imports HelloWorldRemote statement. Then use the RemoteObject type in your program to declare an instance of the RemoteObject object, as shown in the following example.


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


Community Additions

ADD
Show: