別のアプリケーション ドメインでのコードの実行 (C# プログラミング ガイド)

更新 : 2007 年 11 月

アセンブリがアプリケーション ドメインに読み込まれると、そのアセンブリに含まれるコードを実行できます。この操作を行うには、AssemblyLoad を使用するのが最も簡単です。これを使用すると、アセンブリが現在のアプリケーション ドメインに読み込まれ、アセンブリの既定のエントリ ポイントでコードの実行が開始されます。

アセンブリを別のアプリケーション ドメインに読み込むには、ExecuteAssembly または ExecuteAssemblyByName、あるいはこれらのメソッドをオーバーロードした別のバージョンを使用します。

また、既定のエントリ ポイント以外から始まる他のアセンブリを実行する場合は、このリモート アセンブリで新しい型を定義し、MarshalByRefObject から派生します。次に、CreateInstance を使用して、その型のインスタンスをアプリケーションで作成します。

次のファイルは、1 つの名前空間と 2 つのクラスから成るアセンブリを作成します。このアセンブリが既に構築され、HelloWorldRemote.exe という名前で C ドライブに格納されていることを前提にしています。

// 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 クラスのインスタンスをインスタンス化します。これにより、オブジェクト コンストラクタが実行されます。

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

アセンブリを別のアプリケーション ドメインに読み込む場合は、AppDomain.ExecuteAssembly を使用して既定のエントリ ポイントにアクセスするか、または AppDomain.CreateInstance を使用して RemoteObject クラスのインスタンスを作成します。インスタンスを作成すると、コンストラクタが実行されます。

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

アセンブリをプログラムによって読み込まない場合は、ソリューション エクスプローラの [参照の追加] を使用してアセンブリ HelloWorldRemote.exe を指定します。次に、アプリケーションの using ブロックに using HelloWorldRemote; ディレクティブを追加し、プログラムの RemoteObject 型を使用して、次のように RemoteObject オブジェクトのインスタンスを宣言します。

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

参照

概念

C# プログラミング ガイド

アプリケーション ドメインの概要

アプリケーション ドメインとアセンブリ

アプリケーション ドメインを使用したプログラミング

参照

アプリケーション ドメイン (C# プログラミング ガイド)

その他の技術情報

アプリケーション ドメイン

アプリケーション ドメインとアセンブリを使用したプログラミング