別のアプリケーション ドメインでのコードの実行 (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# プログラミング ガイド)