AppDomainSetup.DynamicBase プロパティ
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
動的に生成されたファイルが格納されるディレクトリのベース ディレクトリを取得または設定します。
public:
property System::String ^ DynamicBase { System::String ^ get(); void set(System::String ^ value); };
public string DynamicBase { get; set; }
member this.DynamicBase : string with get, set
Public Property DynamicBase As String
プロパティ値
DynamicDirectory が置かれているディレクトリ。 注: このプロパティの戻り値は、割り当てられた値とは異なります。
実装
例外
アプリケーション ドメインのアプリケーション名が null であるため、このプロパティを設定できません。
例
次の例では、プロパティを使用 DynamicBase して、動的アセンブリを読み込むときにアプリケーション ドメイン プローブのパスを設定する方法を示します。
この例では、オブジェクトを AppDomainSetup 作成し、そのプロパティを ApplicationName "Example" に設定し、そのプロパティを DynamicBase "C:\DynamicAssemblyDir" に設定します。 この例では、プロパティを DynamicBase 表示して、アプリケーション名のハッシュ コードが、最初に割り当てられたパスのサブディレクトリとして追加されたことを示します。
注意
この例のベース ディレクトリは、サンプル アプリケーションのプローブ パスの外側を対象としています。 この例は必ず別の場所でコンパイルしてください。 この例を実行するたびに、基本ディレクトリとそのすべてのサブディレクトリを削除します。
この例では、オブジェクトを使用して新しいアプリケーション ドメインを AppDomainSetup 作成します。 この例では、動的ディレクトリがまだ存在しない場合は、そのディレクトリを作成します。 この例では、アプリケーション ドメインの AppDomain.DynamicDirectory プロパティを使用して動的ディレクトリの名前を取得しますが、元のパス、アプリケーション名のハッシュ コード、アプリケーション名を連結することで、ディレクトリを事前に簡単に作成できます。
この例には、 GenerateDynamicAssembly 名前付きの DynamicHelloWorld.dll アセンブリを出力し、それを新しいアプリケーション ドメインの動的ディレクトリに格納するメソッドがあります。 動的アセンブリには、HelloWorld静的メソッド (SharedVisual Basicのメソッド) という名前HelloFromADの型が 1 つ含まれています。 このメソッドを呼び出すと、アプリケーション ドメインの名前が表示されます。
このExample例では、新しいアプリケーション ドメインにクラスのインスタンスを作成し、そのTestメソッドを呼び出すことができるように、このクラスからMarshalByRefObject派生します。 このメソッドは Test 、動的アセンブリを表示名で読み込み、静的 HelloFromAD メソッドを呼び出します。
この例と同じディレクトリに名前付きの DynamicHelloWorld.dll アセンブリのコードを記述し、コンパイルすることで、通常のプローブ パスの後に動的ディレクトリが検索されることを示すことができます。 アセンブリには、静的メソッドHelloFromADという名前HelloWorldのクラスが必要です。 このメソッドは、例の機能と同じ機能を持つ必要はありません。コンソールに文字列を表示するだけです。 アセンブリには、バージョンを AssemblyVersionAttribute 1.0.0.0 に設定する属性も必要です。 この例を実行すると、動的ディレクトリが検索される前に、現在のディレクトリでコンパイルしたアセンブリが見つかります。
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
public ref class Example : MarshalByRefObject
{
public:
void Test()
{
Assembly^ dynAssem = Assembly::Load(
"DynamicHelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Type^ myType = dynAssem->GetType("HelloWorld");
myType->InvokeMember("HelloFromAD", BindingFlags::Public |
BindingFlags::Static | BindingFlags::InvokeMethod,
Type::DefaultBinder, nullptr, nullptr);
}
};
static void GenerateDynamicAssembly(String^ location)
{
// Define the dynamic assembly and the module. There is only one
// module in this assembly. Note that the call to DefineDynamicAssembly
// specifies the location where the assembly will be saved. The
// assembly version is 1.0.0.0.
//
AssemblyName^ asmName = gcnew AssemblyName("DynamicHelloWorld");
asmName->Version = gcnew Version("1.0.0.0");
AssemblyBuilder^ ab =
AppDomain::CurrentDomain->DefineDynamicAssembly(
asmName, AssemblyBuilderAccess::Save, location);
String^ moduleName = asmName->Name + ".exe";
ModuleBuilder^ mb = ab->DefineDynamicModule(asmName->Name, moduleName);
// Define the "HelloWorld" type, with one static method.
TypeBuilder^ tb = mb->DefineType("HelloWorld", TypeAttributes::Public);
MethodBuilder^ hello = tb->DefineMethod("HelloFromAD",
MethodAttributes::Public | MethodAttributes::Static, nullptr, nullptr);
// The method displays a message that contains the name of the application
// domain where the method is executed.
ILGenerator^ il = hello->GetILGenerator();
il->Emit(OpCodes::Ldstr, "Hello from '{0}'!");
il->Emit(OpCodes::Call, AppDomain::typeid->GetProperty("CurrentDomain")->GetGetMethod());
il->Emit(OpCodes::Call, AppDomain::typeid->GetProperty("FriendlyName")->GetGetMethod());
il->Emit(OpCodes::Call, Console::typeid->GetMethod("WriteLine",
gcnew array<Type^> { String::typeid, String::typeid }));
il->Emit(OpCodes::Ret);
// Complete the HelloWorld type and save the assembly. The assembly
// is placed in the location specified by DefineDynamicAssembly.
Type^ myType = tb->CreateType();
ab->Save(moduleName);
};
void main()
{
// Prepare to create a new application domain.
AppDomainSetup^ setup = gcnew AppDomainSetup();
// Set the application name before setting the dynamic base.
setup->ApplicationName = "Example";
// Set the location of the base directory where assembly resolution
// probes for dynamic assemblies. Note that the hash code of the
// application name is concatenated to the base directory name you
// supply.
setup->DynamicBase = "C:\\DynamicAssemblyDir";
Console::WriteLine("DynamicBase is set to '{0}'.", setup->DynamicBase);
AppDomain^ ad = AppDomain::CreateDomain("MyDomain", nullptr, setup);
// The dynamic directory name is the dynamic base concatenated with
// the application name: <DynamicBase>\<hash code>\<ApplicationName>
String^ dynamicDir = ad->DynamicDirectory;
Console::WriteLine("Dynamic directory is '{0}'.", dynamicDir);
// The AssemblyBuilder won't create this directory automatically.
if (!System::IO::Directory::Exists(dynamicDir))
{
Console::WriteLine("Creating the dynamic directory.");
System::IO::Directory::CreateDirectory(dynamicDir);
}
// Generate a dynamic assembly and store it in the dynamic
// directory.
GenerateDynamicAssembly(dynamicDir);
// Create an instance of the Example class in the application domain,
// and call its Test method to load the dynamic assembly and use it.
Example^ ex = (Example^) ad->CreateInstanceAndUnwrap(
Example::typeid->Assembly->FullName, "Example");
ex->Test();
}
/* This example produces output similar to the following:
DynamicBase is set to 'C:\DynamicAssemblyDir\5e4a7545'.
Dynamic directory is 'C:\DynamicAssemblyDir\5e4a7545\Example'.
Creating the dynamic directory.
Hello from 'MyDomain'!
*/
using System;
using System.Reflection;
using System.Reflection.Emit;
public class Example : MarshalByRefObject
{
static void Main()
{
// Prepare to create a new application domain.
AppDomainSetup setup = new AppDomainSetup();
// Set the application name before setting the dynamic base.
setup.ApplicationName = "Example";
// Set the location of the base directory where assembly resolution
// probes for dynamic assemblies. Note that the hash code of the
// application name is concatenated to the base directory name you
// supply.
setup.DynamicBase = "C:\\DynamicAssemblyDir";
Console.WriteLine("DynamicBase is set to '{0}'.", setup.DynamicBase);
AppDomain ad = AppDomain.CreateDomain("MyDomain", null, setup);
// The dynamic directory name is the dynamic base concatenated with
// the application name: <DynamicBase>\<hash code>\<ApplicationName>
string dynamicDir = ad.DynamicDirectory;
Console.WriteLine("Dynamic directory is '{0}'.", dynamicDir);
// The AssemblyBuilder won't create this directory automatically.
if (!System.IO.Directory.Exists(dynamicDir))
{
Console.WriteLine("Creating the dynamic directory.");
System.IO.Directory.CreateDirectory(dynamicDir);
}
// Generate a dynamic assembly and store it in the dynamic
// directory.
GenerateDynamicAssembly(dynamicDir);
// Create an instance of the Example class in the application domain,
// and call its Test method to load the dynamic assembly and use it.
Example ex = (Example) ad.CreateInstanceAndUnwrap(
typeof(Example).Assembly.FullName, "Example");
ex.Test();
}
public void Test()
{
Assembly dynAssem = Assembly.Load(
"DynamicHelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Type myType = dynAssem.GetType("HelloWorld");
myType.InvokeMember("HelloFromAD", BindingFlags.Public |
BindingFlags.Static | BindingFlags.InvokeMethod,
Type.DefaultBinder, null, null);
}
private static void GenerateDynamicAssembly(string location)
{
// Define the dynamic assembly and the module. There is only one
// module in this assembly. Note that the call to DefineDynamicAssembly
// specifies the location where the assembly will be saved. The
// assembly version is 1.0.0.0.
//
AssemblyName asmName = new AssemblyName("DynamicHelloWorld");
asmName.Version = new Version("1.0.0.0");
AssemblyBuilder ab =
AppDomain.CurrentDomain.DefineDynamicAssembly(
asmName, AssemblyBuilderAccess.Save, location);
String moduleName = asmName.Name + ".exe";
ModuleBuilder mb = ab.DefineDynamicModule(asmName.Name, moduleName);
// Define the "HelloWorld" type, with one static method.
TypeBuilder tb = mb.DefineType("HelloWorld", TypeAttributes.Public);
MethodBuilder hello = tb.DefineMethod("HelloFromAD",
MethodAttributes.Public | MethodAttributes.Static, null, null);
// The method displays a message that contains the name of the application
// domain where the method is executed.
ILGenerator il = hello.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello from '{0}'!");
il.Emit(OpCodes.Call, typeof(AppDomain).GetProperty("CurrentDomain").GetGetMethod());
il.Emit(OpCodes.Call, typeof(AppDomain).GetProperty("FriendlyName").GetGetMethod());
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(String), typeof(String) }));
il.Emit(OpCodes.Ret);
// Complete the HelloWorld type and save the assembly. The assembly
// is placed in the location specified by DefineDynamicAssembly.
Type myType = tb.CreateType();
ab.Save(moduleName);
}
}
/* This example produces output similar to the following:
DynamicBase is set to 'C:\DynamicAssemblyDir\5e4a7545'.
Dynamic directory is 'C:\DynamicAssemblyDir\5e4a7545\Example'.
Creating the dynamic directory.
Hello from 'MyDomain'!
*/
open System
open System.Reflection
open System.Reflection.Emit
type Example() =
inherit MarshalByRefObject()
member _.Test() =
let dynAssem =
Assembly.Load "DynamicHelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
let myType = dynAssem.GetType "HelloWorld"
myType.InvokeMember("HelloFromAD", BindingFlags.Public |||
BindingFlags.Static ||| BindingFlags.InvokeMethod,
Type.DefaultBinder, null, null)
|> ignore
static member GenerateDynamicAssembly(location: string) =
// Define the dynamic assembly and the module. There is only one
// module in this assembly. Note that the call to DefineDynamicAssembly
// specifies the location where the assembly will be saved. The
// assembly version is 1.0.0.0.
let asmName = AssemblyName "DynamicHelloWorld"
asmName.Version <- Version "1.0.0.0"
let ab = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Save, location)
let moduleName = asmName.Name + ".exe"
let mb = ab.DefineDynamicModule(asmName.Name, moduleName)
// Define the "HelloWorld" type, with one static method.
let tb = mb.DefineType("HelloWorld", TypeAttributes.Public)
let hello =
tb.DefineMethod("HelloFromAD", MethodAttributes.Public ||| MethodAttributes.Static, null, null)
// The method displays a message that contains the name of the application
// domain where the method is executed.
let il = hello.GetILGenerator()
il.Emit(OpCodes.Ldstr, "Hello from '{0}'!")
il.Emit(OpCodes.Call, typeof<AppDomain>.GetProperty("CurrentDomain").GetGetMethod())
il.Emit(OpCodes.Call, typeof<AppDomain>.GetProperty("FriendlyName").GetGetMethod())
il.Emit(OpCodes.Call, typeof<Console>.GetMethod("WriteLine", [| typeof<string>; typeof<String> |]))
il.Emit OpCodes.Ret
// Complete the HelloWorld type and save the assembly. The assembly
// is placed in the location specified by DefineDynamicAssembly.
let myType = tb.CreateType()
ab.Save moduleName
// Prepare to create a new application domain.
let setup = AppDomainSetup()
// Set the application name before setting the dynamic base.
setup.ApplicationName <- "Example"
// Set the location of the base directory where assembly resolution
// probes for dynamic assemblies. Note that the hash code of the
// application name is concatenated to the base directory name you
// supply.
setup.DynamicBase <- "C:\\DynamicAssemblyDir"
printfn $"DynamicBase is set to '{setup.DynamicBase}'."
let ad = AppDomain.CreateDomain("MyDomain", null, setup)
// The dynamic directory name is the dynamic base concatenated with
// the application name: <DynamicBase>\<hash code>\<ApplicationName>
let dynamicDir = ad.DynamicDirectory
printfn $"Dynamic directory is '{dynamicDir}'."
// The AssemblyBuilder won't create this directory automatically.
if not (System.IO.Directory.Exists dynamicDir) then
printfn "Creating the dynamic directory."
System.IO.Directory.CreateDirectory dynamicDir
|> ignore
// Generate a dynamic assembly and store it in the dynamic
// directory.
Example.GenerateDynamicAssembly dynamicDir
// Create an instance of the Example class in the application domain,
// and call its Test method to load the dynamic assembly and use it.
let ex = ad.CreateInstanceAndUnwrap(typeof<Example>.Assembly.FullName, "Example") :?> Example
ex.Test()
(* This example produces output similar to the following:
DynamicBase is set to 'C:\DynamicAssemblyDir\5e4a7545'.
Dynamic directory is 'C:\DynamicAssemblyDir\5e4a7545\Example'.
Creating the dynamic directory.
Hello from 'MyDomain'!
*)
Imports System.Reflection
Imports System.Reflection.Emit
Public Class Example
Inherits MarshalByRefObject
Shared Sub Main(args() As String)
' Prepare to create a new application domain.
Dim setup As New AppDomainSetup()
' Set the application name before setting the dynamic base.
setup.ApplicationName = "Example"
' Set the location of the base directory where assembly resolution
' probes for dynamic assemblies. Note that the hash code of the
' application name is concatenated to the base directory name you
' supply.
setup.DynamicBase = "C:\DynamicAssemblyDir"
Console.WriteLine("DynamicBase is set to '{0}'.", setup.DynamicBase)
Dim ad As AppDomain = AppDomain.CreateDomain("MyDomain", Nothing, setup)
' The dynamic directory name is the dynamic base concatenated with
' the application name: <DynamicBase>\<hash code>\<ApplicationName>
Dim dynamicDir As String = ad.DynamicDirectory
Console.WriteLine("Dynamic directory is '{0}'.", dynamicDir)
' The AssemblyBuilder won't create this directory automatically.
If Not System.IO.Directory.Exists(dynamicDir) Then
Console.WriteLine("Creating the dynamic directory.")
System.IO.Directory.CreateDirectory(dynamicDir)
End If
' Generate a dynamic assembly and store it in the dynamic
' directory.
GenerateDynamicAssembly(dynamicDir)
' Create an instance of the Example class in the application domain,
' and call its Test method to load the dynamic assembly and use it.
Dim ex As Example = CType( _
ad.CreateInstanceAndUnwrap( _
GetType(Example).Assembly.FullName, "Example"), Example)
ex.Test()
End Sub
Public Sub Test()
Dim dynAssem As [Assembly] = Assembly.Load(
"DynamicHelloWorld, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
Dim myType As Type = dynAssem.GetType("HelloWorld")
myType.InvokeMember("HelloFromAD", BindingFlags.Public Or _
BindingFlags.Static Or BindingFlags.InvokeMethod, _
Type.DefaultBinder, Nothing, Nothing) 'New Object() {})
End Sub
Private Shared Sub GenerateDynamicAssembly(ByVal location As String)
' Define the dynamic assembly and the module. There is only one
' module in this assembly. Note that the call to DefineDynamicAssembly
' specifies the location where the assembly will be saved. The
' assembly version is 1.0.0.0.
'
Dim asmName As New AssemblyName("DynamicHelloWorld")
asmName.Version = New Version("1.0.0.0")
Dim ab As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly( _
asmName, AssemblyBuilderAccess.Save, location)
Dim moduleName As String = asmName.Name & ".dll"
Dim mb As ModuleBuilder = ab.DefineDynamicModule(asmName.Name, moduleName)
' Define the "HelloWorld" type, with one static method.
Dim tb As TypeBuilder = mb.DefineType("HelloWorld", TypeAttributes.Public)
Dim hello As MethodBuilder = tb.DefineMethod("HelloFromAD", _
MethodAttributes.Public Or MethodAttributes.Static, Nothing, Nothing)
' The method displays a message that contains the name of the application
' domain where the method is executed.
Dim il As ILGenerator = hello.GetILGenerator()
il.Emit(OpCodes.Ldstr, "Hello from '{0}'!")
il.Emit(OpCodes.Call, GetType(AppDomain).GetProperty("CurrentDomain").GetGetMethod())
il.Emit(OpCodes.Call, GetType(AppDomain).GetProperty("FriendlyName").GetGetMethod())
il.Emit(OpCodes.Call, GetType(Console).GetMethod("WriteLine", _
New Type() { GetType(String), GetType(String) }))
il.Emit(OpCodes.Ret)
' Complete the HelloWorld type and save the assembly. The assembly
' is placed in the location specified by DefineDynamicAssembly.
Dim myType As Type = tb.CreateType()
ab.Save(moduleName)
End Sub
End Class
' This example produces output similar to the following:
'
'DynamicBase is set to 'C:\DynamicAssemblyDir\5e4a7545'.
'Dynamic directory is 'C:\DynamicAssemblyDir\5e4a7545\Example'.
'Creating the dynamic directory.
'Hello from 'MyDomain'!
注釈
このプロパティを使用して、新しいアプリケーション ドメインの動的ディレクトリが配置されるベース ディレクトリを設定します。 新しいアプリケーション ドメインのコードがアセンブリを読み込むと、アセンブリの解決は通常のプローブ パスで最初に見られます。 アセンブリが見つからない場合は、プロパティによって返される動的ディレクトリを AppDomain.DynamicDirectory 検索します。 新しいアプリケーション ドメインによって読み込まれて実行される動的アセンブリは、そこに配置できます。
プロパティへのパスを DynamicBase 割り当てると、追加のサブディレクトリが追加されます。このサブディレクトリの名前は、プロパティに ApplicationName 割り当てられた値のハッシュ コードです。 したがって、このプロパティによって後で返されるベース ディレクトリは、常に割り当てられた値と異なります。
重要
このプロパティに値を割り当てると、ディレクトリは作成されません。 ディレクトリは、ディレクトリを使用するコードによって作成または検証する必要があります。
動的ディレクトリは次の DynamicBaseサブディレクトリです。 その単純な名前は、プロパティによってApplicationName返される値であるため、その形式は 元**の pathhash\ codeapplication\ 名です。