AppDomain.DynamicDirectory Propriedade
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Obtém o diretório que usa o resolvedor de assembly para sondar assemblies criados dinamicamente.
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
Valor da propriedade
O diretório que usa o resolvedor de assembly para sondar assemblies criados dinamicamente.
Implementações
Exceções
A operação é tentada em um domínio de aplicativo descarregado.
Exemplos
O exemplo a seguir cria um domínio de aplicativo com um diretório para assemblies dinâmicos, emite um assembly dinâmico e o armazena no diretório dinâmico e carrega o assembly no novo domínio do aplicativo e o usa.
O exemplo cria um AppDomainSetup objeto e define sua ApplicationName propriedade como "Exemplo" e sua DynamicBase propriedade como "C:\DynamicAssemblyDir". Em seguida, o exemplo exibe a DynamicBase propriedade para mostrar que o código hash do nome do aplicativo foi acrescentado como um subdiretório do caminho que foi originalmente atribuído.
Observação
O diretório base neste exemplo destina-se a estar fora do caminho de investigação do aplicativo de exemplo. Certifique-se de compilar o exemplo em um local diferente. Exclua o diretório base e todos os seus subdiretórios sempre que você executar o exemplo.
O exemplo cria um novo domínio de aplicativo, usando o AppDomainSetup objeto. O exemplo usa a DynamicDirectory propriedade para recuperar o nome do diretório, para que ele possa criar o diretório. (O exemplo poderia facilmente criar o diretório de antemão concatenando o caminho original, o código hash do nome do aplicativo e o nome do aplicativo.)
O exemplo tem um GenerateDynamicAssembly
método que emite um assembly nomeado DynamicHelloWorld.dll
e o armazena no diretório dinâmico do novo domínio do aplicativo. O assembly dinâmico contém um tipo, HelloWorld
que tem um método estático (Shared
método em Visual Basic) chamado HelloFromAD
. Chamar esse método exibe o nome do domínio do aplicativo.
A Example
classe deriva de MarshalByRefObject, portanto, o exemplo pode criar uma instância da classe no novo domínio do aplicativo e chamar seu Test
método. O Test
método carrega o assembly dinâmico pelo nome de exibição e chama o método estático HelloFromAD
.
Você pode mostrar que o diretório dinâmico é pesquisado após os caminhos normais de investigação escrevendo código para um assembly nomeado DynamicHelloWorld.dll
e compilando-o no mesmo diretório que este exemplo. O assembly deve ter uma classe nomeada HelloWorld
com um método estático chamado HelloFromAD
. Esse método não precisa ter a mesma funcionalidade que a do exemplo; ele pode simplesmente exibir uma cadeia de caracteres no console. O assembly também deve ter um AssemblyVersionAttribute atributo que define sua versão como 1.0.0.0. Quando você executa o exemplo, o assembly compilado no diretório atual é encontrado antes da pesquisa do diretório dinâmico.
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'!
Comentários
Para definir o diretório dinâmico, atribua um caminho de diretório base à AppDomainSetup.DynamicBase propriedade do AppDomainSetup objeto que será usado para criar o novo domínio do aplicativo. O caminho do diretório base que você atribui à propriedade é modificado pela adição de um subdiretório cujo nome simples é o código hash da cadeia de caracteres que você atribui à AppDomainSetup.ApplicationName propriedade, portanto, o formato do diretório base é o código hash de caminho\ original. O diretório dinâmico é um subdiretório desse diretório base. Seu nome simples é o valor da AppDomainSetup.ApplicationName propriedade, portanto, seu formato é o nome do aplicativo de código\ hash de caminho\ original.