AppDomain.DynamicDirectory Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает каталог, который сопоставитель сборок использует для проверки динамически созданных сборок.
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
Значение свойства
Каталог, который сопоставитель сборок использует для проверки динамически созданных сборок.
Реализации
Исключения
Операция выполняется в выгруженном домене приложения.
Примеры
Следующий пример создает домен приложения с каталогом для динамических сборок, выдает динамическую сборку и сохраняет ее в динамическом каталоге, а затем загружает сборку в новый домен приложения и использует его.
В примере создается AppDomainSetup объект и его ApplicationName свойство имеет значение Example, а его DynamicBase свойство — C:\DynamicAssemblyDir. Затем в примере отображается DynamicBase свойство, чтобы показать, что хэш-код имени приложения был добавлен в подкаталог пути, который был первоначально назначен.
Замечание
Базовый каталог в этом примере предназначен для того, чтобы находиться вне пути проверки для примера приложения. Обязательно скомпилируйте пример в другом расположении. Удалите базовый каталог и все его подкаталоги при каждом запуске примера.
В примере создается новый домен приложения с помощью AppDomainSetup объекта. В примере используется DynamicDirectory свойство для получения имени каталога, поэтому он может создать каталог. (Пример может так же легко создать каталог заранее, объединив исходный путь, хэш-код имени приложения и имя приложения.)
В примере есть GenerateDynamicAssembly метод, который выдает сборку с именем DynamicHelloWorld.dll и сохраняет ее в динамическом каталоге домена приложения. Динамическая сборка содержит один тип, HelloWorldимеющий статический метод (Sharedметод в Visual Basic).HelloFromAD Вызов этого метода отображает имя домена приложения.
Класс Example является производным от MarshalByRefObjectэтого, поэтому пример может создать экземпляр класса в новом домене приложения и вызвать его Test метод. Метод Test загружает динамическую сборку по отображаемой имени и вызывает статический HelloFromAD метод.
Вы можете показать, что динамический каталог выполняется поиск после обычных путей проверки, написав код для сборки с именем DynamicHelloWorld.dll и скомпилируя его в том же каталоге, что и в этом примере. Сборка должна иметь класс HelloWorld с именем HelloFromADстатического метода. Этот метод не должен иметь те же функции, что и в примере; он может просто отобразить строку в консоли. Сборка также должна иметь AssemblyVersionAttribute атрибут, который задает ее версию 1.0.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 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'!
Комментарии
Чтобы задать динамический каталог, назначьте путь к AppDomainSetup.DynamicBase базовому каталогу свойству AppDomainSetup объекта, который будет использоваться для создания нового домена приложения. Базовый путь к каталогу, назначенный свойству, изменяется путем добавления подкаталога, простого имени которого является хэш-код строки, назначаемой AppDomainSetup.ApplicationName свойству, поэтому формат базового каталога — исходныйхэш-код пути\. Динамический каталог является подкаталогом этого базового каталога. Его простое имя — это значение AppDomainSetup.ApplicationName свойства, поэтому его формат — исходное\имя хэш-кодакода\.