検索パスを追加した新しいAppDomain

アセンブリ検索パスを追加した新しいAppDomainを作成・実行するサンプル。

using System;
using System.Reflection;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            AppDomain currentDomain = AppDomain.CurrentDomain;
            Console.WriteLine("START[{0}]", currentDomain.SetupInformation.ApplicationName);

            if (currentDomain.IsDefaultAppDomain())
            {
                AppDomainSetup setup = currentDomain.SetupInformation;
                setup.ApplicationName = "Sample";
                setup.PrivateBinPath = "lib";
                AppDomain sampleDomain = AppDomain.CreateDomain(
                                                "Sample",
                                                AppDomain.CurrentDomain.Evidence,
                                                setup);
                sampleDomain.ExecuteAssembly(Assembly.GetExecutingAssembly().Location);
            }
            else
            {
                runSample();
            }
            Console.WriteLine("END[{0}]", currentDomain.SetupInformation.ApplicationName);
        }
        static void runSample()
        {
            SampleApplication.Program.Main();
        }
    }
}

runSampleで呼び出しているSampleApplication.Program.Mainの定義内容。アセンブリSampleApplication.dllにて定義。

using System;
namespace SampleApplication
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("Hello");
        }
    }
}

それをlib配下に配置する。

■
│  ConsoleApplication1.exe
└─lib
        SampleApplication.exe

ConsoleApplication1.exeの実行結果。

START[]
START[Sample]
Hello
END[Sample]
END[]

メモ

  • ドメイン"Sample"を新しく作成し、そのドメインでは検索パスに"lib"を追加して実行している。
  • 通常は実行フォルダ直下のみが検索パスであるのに対し、AppDomain"Sample"はlib配下も検索パスとなっている。
    • そのため、ilb配下にあるSampleApplication.exeをきちんとロードできている。
  • 動作としては、アプリケーション構成ファイルのprobing要素指定時と同じになる。
  • ロードしたアセンブリのファイルハンドルは実行時にロックされる。
    • このサンプルだと、メソッドrunSampleが呼び出し対象となった時点でSampleApplication.exeがファイルロックされる。

雑感

  • AppDomain/AppDomainSetupの関係が、Process/ProcessStartInfoの関係に似ていると思った。
    • 起動しているProcessに対していくらProcessStartInfoの値いじくっても意味がないのと同じく、起動しているAppDomainのSetUpInformationをいじっても意味がない。