AppDomain.DynamicDirectory Egenskap
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Hämtar den katalog som sammansättningslösaren använder för att söka efter dynamiskt skapade sammansättningar.
public:
property System::String ^ DynamicDirectory { System::String ^ get(); };
public string? DynamicDirectory { get; }
public string DynamicDirectory { get; }
member this.DynamicDirectory : string
Public ReadOnly Property DynamicDirectory As String
Egenskapsvärde
Katalogen som sammansättningslösaren använder för att söka efter dynamiskt skapade sammansättningar.
Implementeringar
Undantag
Åtgärden görs på en oladdad programdomän.
Exempel
I följande exempel skapas en programdomän med en katalog för dynamiska sammansättningar, genererar en dynamisk sammansättning och lagrar den i den dynamiska katalogen och läser sedan in sammansättningen i den nya programdomänen och använder den.
Exemplet skapar ett AppDomainSetup objekt och anger dess ApplicationName egenskap till "Exempel" och dess DynamicBase egenskap till "C:\DynamicAssemblyDir". Exemplet visar DynamicBase sedan egenskapen för att visa att hashkoden för programnamnet har lagts till som en underkatalog för sökvägen som ursprungligen tilldelades.
Note
Baskatalogen i det här exemplet är avsedd att ligga utanför sökvägen för exempelprogrammet. Kompilera exemplet på en annan plats. Ta bort baskatalogen och alla dess underkataloger varje gång du kör exemplet.
I exemplet skapas en ny programdomän med hjälp av AppDomainSetup objektet. Exemplet använder DynamicDirectory egenskapen för att hämta namnet på katalogen, så att den kan skapa katalogen. (Exemplet kan lika enkelt skapa katalogen i förväg genom att sammanfoga den ursprungliga sökvägen, hash-koden för programnamnet och programnamnet.)
Exemplet har en GenerateDynamicAssembly metod som genererar en sammansättning med namnet DynamicHelloWorld.dll och lagrar den i den nya programdomänens dynamiska katalog. Den dynamiska sammansättningen innehåller en typ, HelloWorld, som har en statisk metod (Shared-metoden i Visual Basic) med namnet HelloFromAD. Om du anropar den här metoden visas namnet på programdomänen.
Klassen Example härleds från MarshalByRefObject, så exemplet kan skapa en instans av klassen i den nya programdomänen och anropa dess Test metod. Metoden Test läser in den dynamiska sammansättningen med dess visningsnamn och anropar den statiska HelloFromAD metoden.
Du kan visa att den dynamiska katalogen genomsöks efter de normala sökvägarna för avsökning genom att skriva kod för en sammansättning med namnet DynamicHelloWorld.dll och kompilera den i samma katalog som i det här exemplet. Sammansättningen måste ha en klass med namnet HelloWorld med en statisk metod med namnet HelloFromAD. Den här metoden behöver inte ha samma funktioner som den i exemplet. Det kan helt enkelt visa en sträng i konsolen. Sammansättningen måste också ha ett AssemblyVersionAttribute attribut som anger dess version till 1.0.0.0. När du kör exemplet hittas den sammansättning som du kompilerade i den aktuella katalogen innan den dynamiska katalogen genomsöks.
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'!
Kommentarer
Om du vill ange den dynamiska katalogen tilldelar du en baskatalogsökväg till AppDomainSetup.DynamicBase egenskapen för det AppDomainSetup objekt som ska användas för att skapa den nya programdomänen. Den baskatalogsökväg som du tilldelar egenskapen ändras genom tillägg av en underkatalog vars enkla namn är hashkoden för strängen AppDomainSetup.ApplicationName som du tilldelar egenskapen, så formatet för baskatalogen är ursprunglig sökvägshashkod\. Den dynamiska katalogen är en underkatalog till den här baskatalogen. Dess enkla namn är värdet för AppDomainSetup.ApplicationName egenskapen, så dess format är det ursprungliga namnet på sökvägens\hashkodprogram\.