Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memuatkan Rujukan Perhimpunan secara Rekursif ke dalam AppDomain Berasingan?

Bagaimana untuk Memuatkan Rujukan Perhimpunan secara Rekursif ke dalam AppDomain Berasingan?

Barbara Streisand
Barbara Streisandasal
2025-01-15 11:51:45822semak imbas

How to Recursively Load Assembly References into a Separate AppDomain?

Muatkan pemasangan dan rujukannya secara rekursif dalam AppDomain kendiri

Apabila memuatkan pemasangan ke dalam AppDomain baharu, pastikan anda memuatkan semua rujukannya secara rekursif untuk mengelakkan ralat FileNotFoundException. Artikel ini meneroka langkah-langkah untuk menyelesaikan tugas yang kompleks ini.

Pertama sekali, buat AppDomain kendiri dengan tersuai ApplicationBase. Kemudian, gunakan AssemblyName.GetAssemblyName untuk memuatkan himpunan akar. Walau bagaimanapun, ini sahaja tidak mencukupi; anda perlu memuatkan rujukan pemasangan secara manual.

Untuk melakukan ini, gunakan ReflectionOnlyLoadFrom untuk mendapatkan senarai perhimpunan yang dirujuk tanpa benar-benar memuatkannya. Untuk setiap rujukan, gunakan domain.Load(refAsmName) untuk memuatkannya ke dalam AppDomain.

Walau bagaimanapun, terdapat kaveat di sini. Untuk melaksanakan objek proksi dalam domain aplikasi luaran, anda perlu memanggil CreateInstanceAndUnwrap. Kaedah ini memastikan bahawa objek dilaksanakan dalam AppDomain sasaran.

Contoh kod yang menggambarkan proses ini:

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        AppDomainSetup domaininfo = new AppDomainSetup();
        domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
        Evidence adevidence = AppDomain.CurrentDomain.Evidence;
        AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);

        Type type = typeof(Proxy);
        var value = (Proxy)domain.CreateInstanceAndUnwrap(
            type.Assembly.FullName,
            type.FullName);

        var assembly = value.GetAssembly(args[0]);
        // AppDomain.Unload(domain);
    }
}

public class Proxy : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFile(assemblyPath);
        }
        catch (Exception)
        {
            return null;
            // throw new InvalidOperationException(ex);
        }
    }
}</code>

Ingat bahawa apabila menggunakan LoadFile dan bukannya LoadFrom anda mesti memuatkan sendiri mana-mana kebergantungan untuk mengelakkan FileNotFound pengecualian.

Atas ialah kandungan terperinci Bagaimana untuk Memuatkan Rujukan Perhimpunan secara Rekursif ke dalam AppDomain Berasingan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn