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

Win32におけるプロセスに相当するもので、アプリケーションを格納する領域です。

AppDomainクラス

Type type = typeof(MyClass);
System.Reflection.Assembly assembly = type.Assembly;

// セットアップ用のオブジェクトを作成する
AppDomainSetup adSetup = new AppDomainSetup();
adSetup.ApplicationBase = Path.GetDirectoryName(assembly.Location);

// アセンブリに付与する、許可セットを作成する
PermissionSet grantSet = new PermissionSet(PermissionState.None);
grantSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

// アセンブリの厳密名を取得する
StrongName fullTrustAssemblies = assembly.Evidence.GetHostEvidence<StrongName>();

// 新しいアプリケーション ドメインを作成する
AppDomain ad = AppDomain.CreateDomain("Sandbox", null, adSetup, grantSet, fullTrustAssemblies );

// 目的の型に一致するインスタンスへのハンドルを取得する
ObjectHandle handle = Activator.CreateInstanceFrom(
    ad,
    assembly.ManifestModule.FullyQualifiedName,
    type.FullName);

// ハンドルをアンラップし、目的の型のインスタンスを取得する
MyClass myClass = (MyClass)handle.Unwrap();
方法 : サンドボックスで部分信頼コードを実行する | Microsoft Learn

AppDomainの取得

方法 内容
AppDomain.CurrentDomain 現在のスレッドの、現在のアプリケーション ドメイン AppDomain.CurrentDomain Property (System) | Microsoft Learn
Thread.GetDomain() 現在のスレッドが実行されている、現在のドメイン Thread.GetDomain Method (System.Threading) | Microsoft Learn

プロパティ

プロパティ 内容
AppDomain CurrentDomain 現在のスレッドの、現在のアプリケーション ドメイン
string BaseDirectory  
     
プロパティ - AppDomain Class (System) | Microsoft Learn

メソッド

メソッド 機能
IsDefaultAppDomain() このアプリケーション ドメインがプロセスの既定のアプリケーション ドメインならば、trueを返す
   
メソッド - AppDomain Class (System) | Microsoft Learn

CreateDomain()

新しいアプリケーション ドメインを作成できます。

public static AppDomain CreateDomain (
    string friendlyName,                          // ドメインのフレンドリ名 (friendly name)
    System.Security.Policy.Evidence securityInfo, // アプリケーション ドメインで実行されるコードの識別子を確立する証拠
    AppDomainSetup info                           // アプリケーション ドメインを初期化する情報を格納しているオブジェクト
)
CreateDomain(String, Evidence, AppDomainSetup) - AppDomain.CreateDomain Method (System) | Microsoft Learn
  • securityInfoをnullとすると、現在のアプリケーション ドメインの証拠が使用される。
  • infoをnullとすると、現在のアプリケーション ドメインと同じ構成となる。
public static AppDomain CreateDomain (
    string friendlyName,
    System.Security.Policy.Evidence securityInfo,
    AppDomainSetup info,
    System.Security.PermissionSet grantSet,                        // 新しいアプリケーション ドメインに読み込まれた、特定の許可を持たないアセンブリの、既定の許可セット
    params System.Security.Policy.StrongName[] fullTrustAssemblies // 新しいアプリケーション ドメインで完全に信頼されるアセンブリの、厳密名 (strong name) の配列
);
CreateDomain(String, Evidence, AppDomainSetup, PermissionSet, StrongName[]) - AppDomain.CreateDomain Method (System) | Microsoft Learn

grantSetには、アクセス許可のコレクションを指定します。

PermissionSetクラス

PermissionSetAttributeは別のクラスです。PermissionSetAttribute Class (System.Security.Permissions) | Microsoft Learn

AddPermission()
public System.Security.IPermission AddPermission (System.Security.IPermission perm);
PermissionSet.AddPermission(IPermission) Method (System.Security) | Microsoft Learn

引数のIPermissionインターフェイスは、次のようなクラスで実装されています。

  • System.Security.IPermission
    • System.IdentityModel.Services.ClaimsPrincipalPermission
    • System.Security.CodeAccessPermission
      • System.Security.Permissions.ReflectionPermission
      • System.Security.Permissions.SecurityPermission
    • System.Security.Permissions.PrincipalPermission

そしてそのひとつであるSecurityPermissionは、SecurityPermissionFlagから次のように生成できます。

public SecurityPermission (System.Security.Permissions.SecurityPermissionFlag flag);
SecurityPermission(SecurityPermissionFlag) - SecurityPermission コンストラクター (System.Security.Permissions) | Microsoft Learn
SecurityPermissionFlag
列挙子 意味
AllFlags 16383 The unrestricted state of the permission.
Assertion 1 Ability to assert that all this code's callers have the requisite permission for the operation.
BindingRedirects 8192 Permission to perform explicit binding redirection in the application configuration file. This includes redirection of .NET Framework assemblies that have been unified as well as other assemblies found outside the .NET Framework.
ControlAppDomain 1024 Ability to create and manipulate an AppDomain.
ControlDomainPolicy 256 Ability to specify domain policy.
ControlEvidence 32 Ability to provide evidence, including the ability to alter the evidence provided by the common language runtime.
ControlPolicy 64 Ability to view and modify policy.
ControlPrincipal 512 Ability to manipulate the principal object.
ControlThread 16 Ability to use certain advanced operations on threads.
Execution 8 Permission for the code to run. Without this permission, managed code will not be executed.
Infrastructure 4096 Permission to plug code into the common language runtime infrastructure, such as adding Remoting Context Sinks, Envoy Sinks and Dynamic Sinks.
NoFlags 0 No security access.
RemotingConfiguration 2048 Permission to configure Remoting types and channels.
SerializationFormatter 128 Ability to provide serialization services. Used by serialization formatters.
SkipVerification 4 Ability to skip verification of code in this assembly. Code that is unverifiable can be run if this permission is granted.
UnmanagedCode 2 Ability to call unmanaged code.
SecurityPermissionFlag Enum (System.Security.Permissions) | Microsoft Learn インサイド .NET Framework [改訂版]第8回 コード・アクセス・セキュリティ(その3)(3/5) - @IT 吉松史彰 (2003/08/27)
StrongNameクラス

fullTrustAssembliesには、アセンブリの厳密名を渡します。この引数はparamsにより可変引数とされているため、渡すのは1つのインスタンスでも構いません。

StrongName fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();

GetHostEvidence()がnullを返すときには、対象のアセンブリが署名されているか確認します。Evidence.GetHostEvidence Method (System.Security.Policy) | Microsoft Learn

CreateInstanceAndUnwrap()

指定の型の、新しいインスタンスを生成できます。

public object CreateInstanceAndUnwrap (
    string assemblyName, // アセンブリの表示名
    string typeName      // 要求する型の完全修飾名 (fully qualified name)
)
CreateInstanceAndUnwrap(String, String) - AppDomain.CreateInstanceAndUnwrap Method (System) | Microsoft Learn
  • FileNotFoundException「ファイルまたはアセンブリ 'assemblyName'、またはその依存関係の 1 つが読み込めませんでした。」 … assemblyNameの誤り
  • TypeLoadException「アセンブリ 'assemblyName' から型 'typeName' を読み込めませんでした。」 … typeNameの誤り
  • SerializationException「アセンブリ 'assemblyName' の型 'typeName' はシリアル化可能として設定されていません。」 … 対象の型がMarshalByRefObjectを継承せず、[Serializable]の指定もされていない
AppDomain ad = AppDomain.CreateDomain("TEST", null, null);

MyClass myClass = (MyClass)ad.CreateInstanceAndUnwrap(
    typeof(MyClass).Assembly.FullName,
    typeof(MyClass).FullName);

ExecuteAssembly()

指定のファイルに格納されているアセンブリを実行できます。

public int ExecuteAssembly (string assemblyFile);
ExecuteAssembly(String) - AppDomain.ExecuteAssembly Method (System) | Microsoft Learn
AppDomain ad = AppDomain.CreateDomain("TEST",null, null);

ad.ExecuteAssembly("sample.exe");

GetCurrentThreadId()

現在のスレッドの識別子を取得できます。

public static int GetCurrentThreadId ();
AppDomain.GetCurrentThreadId Method (System) | Microsoft Learn
#pragma warning disable 0618

int threadId = AppDomain.GetCurrentThreadId();

#pragma warning restore 0618

イベント

UnhandledException

例外が捕捉されない場合に発生します。AppDomain.UnhandledException Event (System) | Microsoft Learn

ProcessExit

既定のアプリケーション ドメインの親プロセスが終了するときに発生します。.NET Framework 2.0以降では、ハンドラが登録されているアプリケーション ドメインごとに発生します。AppDomain.ProcessExit Event (System) | Microsoft Learn

このハンドラを登録するにはアクセス許可が必要で、それがないと「型 'System.Security.Permissions.ReflectionPermission, ***' のアクセス許可の要求に失敗しました。」としてSecurityException例外が投げられます。

PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.MemberAccess));

プロセス終了時のファイナライザの実行時間が制限されるのと同様に、ProcessExitのハンドラの時間も制限されます。その時間は既定で2秒です。

Microsoft Learnから検索