検索パスを追加した新しい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をいじっても意味がない。