Share via


AppDomain.TypeResolve イベント

型の解決が失敗したときに発生します。

Public Overridable Event TypeResolve As ResolveEventHandler
[C#]
public virtual event ResolveEventHandler TypeResolve;
[C++]
public: virtual __event ResolveEventHandler* TypeResolve;

[JScript] JScript では、このクラスで定義されているイベントを処理できます。ただし、独自に定義することはできません。

イベント データ

イベント ハンドラが、このイベントに関連するデータを含む、ResolveEventArgs 型の引数を受け取りました。次の ResolveEventArgs プロパティには、このイベントの固有の情報が記載されます。

プロパティ 説明
Name 解決する項目の名前を取得します。

解説

TypeResolve イベントは、共通言語ランタイムが要求された型を作成できるアセンブリを判別できなかったときに発生します。このイベントは、型が動的アセンブリで定義されている場合、または動的アセンブリでは定義されていないが、ランタイムが型を定義しているアセンブリを判別できない場合に、発生することがあります。後者は、 Type.GetType をアセンブリ名で限定されていない型の名前で呼び出したときに発生することがあります。

このイベントの ResolveEventHandler で、型の検索と作成を試行できます。

ただし、型を特定のアセンブリで見つけることができないことをランタイムが認識している場合は、 TypeResolve イベントは発生しません。たとえば、静的アセンブリへ動的に型を追加できないことをランタイムが認識しているという理由で静的アセンブリで型を見つけることができない場合、このイベントは発生しません。

このイベントに対するイベント ハンドラを登録するには、Permissions のセクションで説明したアクセス許可が必要です。適切なアクセス許可がない場合は、SecurityException が発生します。

イベント処理の詳細については、「 イベントの利用 」を参照してください。

使用例

[Visual Basic, C#, C++] TypeResolve イベントのサンプルを次に示します。

[Visual Basic, C#, C++] このコード例を実行するには、アセンブリの完全限定名を指定する必要があります。アセンブリの完全限定名を取得する方法については、「 アセンブリ名 」を参照してください。

 
Imports System
Imports System.Reflection
Imports System.Windows.Forms

Module Test

   Sub Main()
      ' You must supply a valid fully qualified assembly name here. 
      FindType("System.Windows.Forms.TextBox, System.Windows.FormsSystem.Windows.Forms, Version, Culture, PublicKeyToken")
      ' OK!

      FindType("System.Windows.Forms.TextBox")
      ' Failed!

      Dim currentDomain As AppDomain = AppDomain.CurrentDomain
      AddHandler currentDomain.TypeResolve, AddressOf MyResolver
      
      FindType("System.Windows.Forms.TextBox")
      ' OK!
   End Sub 'Main
   
   Sub FindType(name As String)
      Try
         Dim t As Type = Type.GetType(name, True)
         Console.WriteLine(t.FullName)
      Catch e As Exception
         Console.WriteLine(e.Message)
      End Try
   End Sub 'FindType

   Function MyResolver(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
      Console.WriteLine("MyResolver fired...")
      Return GetType(TextBox).Assembly
   End Function 'MyResolver

End Module 'Test

[C#] 
using System;
using System.Reflection;
using System.Windows.Forms;

class Test {
   public static void Main() {
      // You must supply a valid fully qualified assembly name here. 
      FindType("System.Windows.Forms.TextBox, System.Windows.Forms, Version, Culture, PublicKeyToken");
      // OK!

      FindType("System.Windows.Forms.TextBox");
      // Failed!

      AppDomain currentDomain = AppDomain.CurrentDomain;
      currentDomain.TypeResolve += new ResolveEventHandler(MyResolver);
      
      FindType("System.Windows.Forms.TextBox");
      // OK!
   }

   static void FindType(string name) {
      try {
         Type t = Type.GetType(name, true);
         Console.WriteLine(t.FullName);
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }
   
   static Assembly MyResolver(object sender, ResolveEventArgs args) {
      Console.WriteLine("MyResolver fired...");
      return typeof(TextBox).Assembly;
   }
}

[C++] 
#using <mscorlib.dll>
#using <System.dll>
#using <System.Windows.Forms.dll>

using namespace System;
using namespace System::Reflection;
using namespace System::Windows::Forms;

__gc class Test {
   static void FindType(String* name) {
      try {
         Type*  t = Type::GetType(name, true);
         Console::WriteLine(t->FullName);
      } catch (Exception* e) {
         Console::WriteLine(e->Message);
      }
   }

   static Assembly* MyResolver(Object* sender, ResolveEventArgs* args) {
      Console::WriteLine(S"MyResolver fired...");
      return __typeof(TextBox)->Assembly;
   }
public:
   static void test() {
      // You must supply a valid fully qualified assembly name here.
      FindType(S"System.Windows.Forms.TextBox, System.Windows.Forms, Version, Culture, PublicKeyToken");
      // OK!

      FindType(S"System.Windows.Forms.TextBox");
      // Failed!

      AppDomain*  currentDomain = AppDomain::CurrentDomain;
      currentDomain->TypeResolve += new ResolveEventHandler(0, MyResolver);

      FindType(S"System.Windows.Forms.TextBox");
      // OK!
   }

};

int main(){
   Test::test();
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

.NET Framework セキュリティ:

参照

AppDomain クラス | AppDomain メンバ | System 名前空間