AppDomainSetup.DynamicBase Özellik
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Dinamik olarak oluşturulan dosyaların dizininin bulunduğu temel dizini alır veya ayarlar.
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
Özellik Değeri
öğesinin DynamicDirectory bulunduğu dizin. Not: Bu özelliğin dönüş değeri atanan değerden farklıdır.
Uygulamalar
Özel durumlar
Uygulama etki alanındaki uygulama adı olduğundan bu null
özellik ayarlanamıyor.
Örnekler
Aşağıdaki örnekte, dinamik derlemeler yüklenirken uygulama etki alanı yoklamalarının yolunu ayarlamak için özelliğinin nasıl kullanılacağı DynamicBase gösterilmektedir.
Örnek bir AppDomainSetup nesne oluşturur ve özelliğini "Example" ve DynamicBase özelliğini "C:\DynamicAssemblyDir" olarak ayarlarApplicationName. Örnek daha sonra, uygulama adının karma kodunun başlangıçta atanmış olan yolun alt dizini olarak eklendiğini göstermek için özelliğini görüntüler DynamicBase .
Not
Bu örnekteki temel dizinin örnek uygulama için yoklama yolunun dışında olması amaçlanmıştır. Örneği farklı bir konumda derlemeye özen gösterin. Örneği her çalıştırdığınızda temel dizini ve tüm alt dizinlerini silin.
Örnek, nesnesini kullanarak AppDomainSetup yeni bir uygulama etki alanı oluşturur. Örnek daha sonra henüz yoksa dinamik dizini oluşturur. Örnek, dinamik dizinin adını almak için uygulama etki alanının AppDomain.DynamicDirectory özelliğini kullansa da, özgün yolu, uygulama adının karma kodunu ve uygulama adını birleştirerek dizini önceden kolayca oluşturabilir.
Örnekte adlı DynamicHelloWorld.dll
bir GenerateDynamicAssembly
derlemeyi yayan ve yeni uygulama etki alanının dinamik dizininde depolayan bir yöntemi vardır. Dinamik derleme, HelloWorld
adlı HelloFromAD
statik bir yöntemi (Shared
Visual Basic'te yöntemi) olan bir türü içerir. Bu yöntemin çağrılması, uygulama etki alanının adını görüntüler.
sınıfı Example
öğesinden MarshalByRefObjecttüretilir, böylece örnek yeni uygulama etki alanında sınıfının bir örneğini oluşturabilir ve yöntemini çağırabilir Test
. yöntemi dinamik Test
derlemeyi görünen adına göre yükler ve statik HelloFromAD
yöntemi çağırır.
Adlı DynamicHelloWorld.dll
bir derlemenin kodunu yazarak ve bu örnekle aynı dizinde derleyerek normal yoklama yollarından sonra dinamik dizinin arandığını gösterebilirsiniz. Derlemenin adlı statik yöntemi ile adlı HelloWorld
HelloFromAD
bir sınıfı olmalıdır. Bu yöntemin örnektekiyle aynı işlevselliğe sahip olması gerekmez; konsolda bir dize görüntüleyebilir. Derlemenin, sürümünü 1.0.0.0 olarak ayarlayan bir AssemblyVersionAttribute özniteliği de olmalıdır. Örneği çalıştırdığınızda, dinamik dizin aranmadan önce geçerli dizinde derlediğiniz derleme bulunur.
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 AddDynamicBaseSnippet : 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.
AddDynamicBaseSnippet ex = (AddDynamicBaseSnippet) ad.CreateInstanceAndUnwrap(
typeof(AddDynamicBaseSnippet).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'!
Açıklamalar
Yeni uygulama etki alanının dinamik dizininin bulunacağı temel dizini ayarlamak için bu özelliği kullanın. Yeni uygulama etki alanındaki kod bir derlemeyi yüklediğinde, derleme çözümlemesi normal yoklama yollarında ilk sırada görünür. Derlemeyi bulamazsa, özelliği tarafından döndürülen dinamik dizine AppDomain.DynamicDirectory bakar. Yeni uygulama etki alanı tarafından yüklenip yürütülecek dinamik derlemeler buraya yerleştirilebilir.
Özelliğe bir yol DynamicBase atadığınızda ek bir alt dizin eklenir; bu alt dizinin adı özelliğe atanan ApplicationName değerin karma kodudur. Bu nedenle, daha sonra bu özellik tarafından döndürülen temel dizin her zaman atanan değerden farklıdır.
Önemli
Bu özelliğe değer atanması herhangi bir dizin oluşturmaz. Dizinler, bunları kullanan kod tarafından oluşturulmalıdır veya doğrulanmalıdır.
Dinamik dizin, öğesinin DynamicBasebir alt dizinidir. Basit adı özelliği tarafından ApplicationName döndürülen değerdir, bu nedenle biçimi özgün yol\karma kodu\uygulama adıdır.