AppDomain.TypeResolve 이벤트
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
형식을 확인하지 못할 경우 발생합니다.
public:
event ResolveEventHandler ^ TypeResolve;
public:
virtual event ResolveEventHandler ^ TypeResolve;
public event ResolveEventHandler? TypeResolve;
public event ResolveEventHandler TypeResolve;
[add: System.Security.SecurityCritical]
[remove: System.Security.SecurityCritical]
public event ResolveEventHandler TypeResolve;
member this.TypeResolve : ResolveEventHandler
[<add: System.Security.SecurityCritical>]
[<remove: System.Security.SecurityCritical>]
member this.TypeResolve : ResolveEventHandler
Public Custom Event TypeResolve As ResolveEventHandler
이벤트 유형
구현
- 특성
예제
다음 샘플에서는 이벤트를 보여 줍니다 TypeResolve .
이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
private:
static Assembly^ HandleTypeResolve(Object^ sender, ResolveEventArgs^ args)
{
Console::WriteLine("TypeResolve event handler.");
// Save the dynamic assembly, and then load it using its
// display name. Return the loaded assembly.
//
ab->Save(moduleName);
return Assembly::Load(ab->FullName);
}
// For this code example, the following information needs to be
// available to both Demo and the HandleTypeResolve event
// handler:
static AssemblyBuilder^ ab;
static String^ moduleName;
public:
static void Demo()
{
AppDomain^ currDom = AppDomain::CurrentDomain;
// Create a dynamic assembly with one module, to be saved to
// disk (AssemblyBuilderAccess::Save).
//
AssemblyName^ aName = gcnew AssemblyName();
aName->Name = "Transient";
moduleName = aName->Name + ".dll";
ab = currDom->DefineDynamicAssembly(aName,
AssemblyBuilderAccess::Save);
ModuleBuilder^ mb = ab->DefineDynamicModule(aName->Name, moduleName);
// The dynamic assembly has just one dummy type, to demonstrate
// type resolution.
TypeBuilder^ tb = mb->DefineType("Example");
tb->CreateType();
// First, try to load the type without saving the dynamic
// assembly and without hooking up the TypeResolve event. The
// type cannot be loaded.
try
{
Type^ temp = Type::GetType("Example", true);
Console::WriteLine("Loaded type {0}.", temp);
}
catch (TypeLoadException^)
{
Console::WriteLine("Loader could not resolve the type.");
}
// Hook up the TypeResolve event.
//
currDom->TypeResolve +=
gcnew ResolveEventHandler(HandleTypeResolve);
// Now try to load the type again. The TypeResolve event is
// raised, the dynamic assembly is saved, and the dummy type is
// loaded successfully. Display it to the console, and create
// an instance.
Type^ t = Type::GetType("Example", true);
Console::WriteLine("Loaded type \"{0}\".", t);
Object^ o = Activator::CreateInstance(t);
}
};
void main()
{
Test::Demo();
}
/* This code example produces the following output:
Loader could not resolve the type.
TypeResolve event handler.
Loaded type "Example".
*/
using System;
using System.Reflection;
using System.Reflection.Emit;
class Test
{
// For this code example, the following information needs to be
// available to both Main and the HandleTypeResolve event
// handler:
private static AssemblyBuilder ab;
private static string moduleName;
public static void Main()
{
AppDomain currDom = AppDomain.CurrentDomain;
// Create a dynamic assembly with one module, to be saved to
// disk (AssemblyBuilderAccess.Save).
//
AssemblyName aName = new AssemblyName();
aName.Name = "Transient";
moduleName = aName.Name + ".dll";
ab = currDom.DefineDynamicAssembly(aName,
AssemblyBuilderAccess.Save);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, moduleName);
// The dynamic assembly has just one dummy type, to demonstrate
// type resolution.
TypeBuilder tb = mb.DefineType("Example");
tb.CreateType();
// First, try to load the type without saving the dynamic
// assembly and without hooking up the TypeResolve event. The
// type cannot be loaded.
try
{
Type temp = Type.GetType("Example", true);
Console.WriteLine("Loaded type {0}.", temp);
}
catch (TypeLoadException)
{
Console.WriteLine("Loader could not resolve the type.");
}
// Hook up the TypeResolve event.
//
currDom.TypeResolve +=
new ResolveEventHandler(HandleTypeResolve);
// Now try to load the type again. The TypeResolve event is
// raised, the dynamic assembly is saved, and the dummy type is
// loaded successfully. Display it to the console, and create
// an instance.
Type t = Type.GetType("Example", true);
Console.WriteLine("Loaded type \"{0}\".", t);
Object o = Activator.CreateInstance(t);
}
static Assembly HandleTypeResolve(object sender, ResolveEventArgs args)
{
Console.WriteLine("TypeResolve event handler.");
// Save the dynamic assembly, and then load it using its
// display name. Return the loaded assembly.
//
ab.Save(moduleName);
return Assembly.Load(ab.FullName);
}
}
/* This code example produces the following output:
Loader could not resolve the type.
TypeResolve event handler.
Loaded type "Example".
*/
open System
open System.Reflection
open System.Reflection.Emit
let currDom = AppDomain.CurrentDomain
// Create a dynamic assembly with one module, to be saved to
// disk (AssemblyBuilderAccess.Save).
//
let aName = AssemblyName()
aName.Name <- "Transient"
let moduleName = aName.Name + ".dll"
let ab = currDom.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Save)
let handleTypeResolve _ _ =
printfn "TypeResolve event handler."
// Save the dynamic assembly, and then load it using its
// display name. Return the loaded assembly.
ab.Save moduleName
Assembly.Load ab.FullName
let mb = ab.DefineDynamicModule(aName.Name, moduleName)
// The dynamic assembly has just one dummy type, to demonstrate
// type resolution.
let tb = mb.DefineType "Example"
tb.CreateType() |> ignore
// First, try to load the type without saving the dynamic
// assembly and without hooking up the TypeResolve event. The
// type cannot be loaded.
try
let temp = Type.GetType("Example", true)
printfn $"Loaded type {temp}."
with :? TypeLoadException ->
printfn "Loader could not resolve the type."
// Hook up the TypeResolve event.
//
currDom.add_TypeResolve(ResolveEventHandler handleTypeResolve)
// Now try to load the type again. The TypeResolve event is
// raised, the dynamic assembly is saved, and the dummy type is
// loaded successfully. Display it to the console, and create
// an instance.
let t = Type.GetType("Example", true)
printfn $"Loaded type \"{t}\"."
let o = Activator.CreateInstance t
(* This code example produces the following output:
Loader could not resolve the type.
TypeResolve event handler.
Loaded type "Example".
*)
Option Strict On
Option Explicit On
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
' For this code example, the following information needs to be
' available to both Main and the HandleTypeResolve event
' handler:
Private ab As AssemblyBuilder
Private moduleName As String
Sub Main()
Dim currDom As AppDomain = AppDomain.CurrentDomain
' Create a dynamic assembly with one module, to be saved to
' disk (AssemblyBuilderAccess.Save).
'
Dim aName As AssemblyName = new AssemblyName()
aName.Name = "Transient"
moduleName = aName.Name + ".dll"
ab = currDom.DefineDynamicAssembly(aName, _
AssemblyBuilderAccess.Save)
Dim mb As ModuleBuilder = _
ab.DefineDynamicModule(aName.Name, moduleName)
' The dynamic assembly has just one dummy type, to demonstrate
' type resolution.
Dim tb As TypeBuilder = mb.DefineType("Example")
tb.CreateType()
' First, try to load the type without saving the dynamic
' assembly and without hooking up the TypeResolve event. The
' type cannot be loaded.
Try
Dim temp As Type = Type.GetType("Example", true)
Console.WriteLine("Loaded type {0}.", temp)
Catch ex As TypeLoadException
Console.WriteLine("Loader could not resolve the type.")
End Try
' Hook up the TypeResolve event.
'
AddHandler currDom.TypeResolve, AddressOf HandleTypeResolve
' Now try to load the type again. The TypeResolve event is
' raised, the dynamic assembly is saved, and the dummy type is
' loaded successfully. Display it to the console, and create
' an instance.
Dim t As Type = Type.GetType("Example", true)
Console.WriteLine("Loaded type ""{0}"".", t)
Dim o As Object = Activator.CreateInstance(t)
End Sub
Private Function HandleTypeResolve(ByVal sender As Object, _
ByVal e As ResolveEventArgs) As [Assembly]
Console.WriteLine("TypeResolve event handler.")
' Save the dynamic assembly, and then load it using its
' display name. Return the loaded assembly.
'
ab.Save(moduleName)
Return [Assembly].Load(ab.FullName)
End Function
End Module
' This code example produces the following output:
'
'Loader could not resolve the type.
'TypeResolve event handler.
'Loaded type "Example".
'
설명
이 TypeResolve 이벤트는 공용 언어 런타임이 요청된 형식을 만들 수 있는 어셈블리를 확인할 수 없는 경우에 발생합니다. 이 문제는 형식이 동적 어셈블리에 정의되어 있거나 형식이 동적 어셈블리에 정의되어 있지 않지만 런타임에서 형식이 정의된 어셈블리를 모르는 경우에 발생할 수 있습니다. 후자의 상황은 가 어셈블리 이름으로 정규화되지 않은 형식 이름으로 호출되는 경우에 Type.GetType 발생할 수 있습니다.
이 이벤트의 은 ResolveEventHandler 형식을 찾아서 만들 수 있습니다.
그러나 런타임이 TypeResolve 특정 어셈블리에서 형식을 찾을 수 없다는 것을 알고 있으면 이벤트가 발생하지 않습니다. 예를 들어 런타임은 형식을 정적 어셈블리에 동적으로 추가할 수 없다는 것을 알고 있으므로 정적 어셈블리에서 형식을 찾을 수 없는 경우 이 이벤트가 발생하지 않습니다.
.NET Framework 4부터 속성에는 ResolveEventArgs.RequestingAssembly 형식을 요청한 어셈블리가 포함됩니다. 자세한 내용은 ResolveEventArgs.RequestingAssembly를 참조하세요.
이 이벤트에 대한 이벤트 처리기를 등록하려면 필요한 권한이 있거나 이 SecurityException throw되어야 합니다.
이벤트 처리에 대한 자세한 내용은 이벤트 처리 및 발생 을 참조하십시오.
적용 대상
추가 정보
.NET