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當 Common Language Runtime 無法判斷可建立要求類型的元件時,就會發生此事件。 如果類型是在動態元件中定義,或類型未定義于動態元件中,但執行時間不知道類型定義所在的元件,就可能發生此情況。 使用未以元件名稱限定的類型名稱呼叫 時 Type.GetType ,可能會發生後者的情況。
ResolveEventHandler這個事件的 可以嘗試尋找並建立型別。
不過, TypeResolve 如果執行時間知道在特定元件中找不到類型,則不會發生此事件。 例如,如果在靜態元件中找不到類型,則不會發生此事件,因為執行時間知道類型無法動態新增至靜態元件。
從 .NET Framework 4 開始, ResolveEventArgs.RequestingAssembly 屬性會包含要求型別的元件。 如需詳細資訊,請參閱ResolveEventArgs.RequestingAssembly。
若要註冊此事件的事件處理常式,您必須具有必要的許可權,否則 SecurityException 會擲回 。
如需處理事件的詳細資訊,請參閱 處理和引發事件。