Baca dalam bahasa Inggris

Bagikan melalui


AppDomain.AssemblyResolve Kejadian

Definisi

Terjadi ketika resolusi assembly gagal.

public event ResolveEventHandler? AssemblyResolve;
public event ResolveEventHandler AssemblyResolve;
[add: System.Security.SecurityCritical]
[remove: System.Security.SecurityCritical]
public event ResolveEventHandler AssemblyResolve;

Jenis Acara

Penerapan

Atribut

Contoh

Sampel berikut menunjukkan peristiwa tersebut AssemblyResolve .

Agar contoh kode ini berjalan, Anda harus memberikan nama rakitan yang sepenuhnya memenuhi syarat. Untuk informasi tentang cara mendapatkan nama rakitan yang sepenuhnya memenuhi syarat, lihat Nama Rakitan.

public class MyType
{
    public MyType()
    {
        Console.WriteLine();
        Console.WriteLine("MyType instantiated!");
    }
}

class AssemblyResolveSnippet
{
    public static void Main()
    {
        AppDomain currentDomain = AppDomain.CurrentDomain;

        // This call will fail to create an instance of MyType since the
        // assembly resolver is not set
        InstantiateMyTypeFail(currentDomain);

        currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

        // This call will succeed in creating an instance of MyType since the
        // assembly resolver is now set.
        InstantiateMyTypeFail(currentDomain);

        // This call will succeed in creating an instance of MyType since the
        // assembly name is valid.
        InstantiateMyTypeSucceed(currentDomain);
    }

    private static void InstantiateMyTypeFail(AppDomain domain)
    {
        // Calling InstantiateMyType will always fail since the assembly info
        // given to CreateInstance is invalid.
        try
        {
            // You must supply a valid fully qualified assembly name here.
            domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyType");
        }
        catch (Exception e)
        {
            Console.WriteLine();
            Console.WriteLine(e.Message);
        }
    }

    private static void InstantiateMyTypeSucceed(AppDomain domain)
    {
        try
        {
            string asmname = Assembly.GetCallingAssembly().FullName;
            domain.CreateInstance(asmname, "MyType");
        }
        catch (Exception e)
        {
            Console.WriteLine();
            Console.WriteLine(e.Message);
        }
    }

    private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
    {
        Console.WriteLine("Resolving...");
        return typeof(MyType).Assembly;
    }
}

Keterangan

Adalah tanggung jawab ResolveEventHandler untuk peristiwa ini untuk mengembalikan assembly yang ditentukan oleh ResolveEventArgs.Name properti , atau untuk mengembalikan null jika assembly tidak dikenali. Perakitan harus dimuat ke dalam konteks eksekusi; jika dimuat ke dalam konteks hanya refleksi, beban yang menyebabkan peristiwa ini dinaikkan gagal.

Untuk panduan tentang penggunaan peristiwa ini, lihat Menyelesaikan Beban Rakitan.

Dimulai dengan .NET Framework 4, ResolveEventArgs.RequestingAssembly properti mengembalikan rakitan yang meminta beban rakitan yang tidak dapat diselesaikan. Misalnya, loader mungkin tidak dapat memuat dependensi dari perakitan yang meminta karena perakitan yang meminta dan dependensinya tidak berada di jalur pemeriksaan. Mengetahui identitas perakitan yang meminta mungkin berguna dalam menemukan dependensi atau dalam mengidentifikasi versi yang benar, jika tersedia lebih dari satu versi dependensi. Untuk informasi selengkapnya, lihat ResolveEventArgs.RequestingAssembly.

Penting

Dimulai dengan .NET Framework 4, ResolveEventHandler acara dinaikkan untuk semua rakitan, termasuk rakitan sumber daya. Di versi sebelumnya, peristiwa tidak dinaikkan untuk rakitan sumber daya. Jika sistem operasi dilokalkan, handler mungkin dipanggil beberapa kali: sekali untuk setiap budaya dalam rantai fallback.

Untuk kejadian ini, ResolveEventArgs.Name properti mengembalikan nama rakitan sebelum kebijakan diterapkan.

Penting

Jika lebih dari satu penanganan aktivitas terdaftar untuk peristiwa ini, penanganan aktivitas dipanggil secara berurutan hingga penanganan aktivitas mengembalikan nilai yang bukan null. Penanganan aktivitas berikutnya diabaikan.

Untuk informasi selengkapnya tentang menangani peristiwa, lihat Menangani dan Menaikkan Peristiwa.

Berlaku untuk

Produk Versi
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Lihat juga