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

Bagaimana untuk Memuatkan Perhimpunan dan Ketergantungannya secara Rekursif ke dalam AppDomain Berasingan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-15 12:03:46259semak imbas

How to Recursively Load Assemblies and Their Dependencies into a Separate AppDomain?

Memuatkan Perhimpunan dan Ketergantungan ke dalam AppDomain Berasingan: Pendekatan Rekursif

Memuatkan himpunan dengan kebergantungan yang rumit ke dalam AppDomain baharu boleh memberikan cabaran. Ralat seperti "Tidak dapat memuatkan fail atau pemasangan... atau salah satu kebergantungannya" kerap berlaku kerana perhimpunan yang dirujuk tidak dimuatkan secara automatik. Ini memerlukan proses pemuatan rekursif manual.

Penyelesaian melibatkan langkah-langkah utama ini:

  1. Penciptaan AppDomain: Mula-mula, wujudkan AppDomain baharu:

    <code class="language-csharp"> AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
     setup.ApplicationBase = dir;
     AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);</code>
  2. Memuatkan Pemasangan Utama: Muatkan pemasangan utama menggunakan AssemblyName:

    nya
    <code class="language-csharp"> domain.Load(AssemblyName.GetAssemblyName(path));</code>
  3. Resolusi Rujukan Rekursif: Lelaran melalui rujukan pemasangan yang dimuatkan dalam AppDomain baharu:

    <code class="language-csharp"> foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies())
     {
      // Utilize a proxy object for cross-AppDomain access
      Type type = typeof(Proxy);
      var value = (Proxy)domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
    
      // Load the referenced assembly in the target AppDomain
      value.GetAssembly(refAsmName.FullName);
     }</code>
  4. Kelas Proksi untuk Interaksi Merentas Domain: Kelas Proxy memudahkan komunikasi antara AppDomains:

    <code class="language-csharp"> class Proxy : MarshalByRefObject
     {
      public Assembly GetAssembly(string assemblyPath)
      {
          try
          {
              return Assembly.LoadFile(assemblyPath);
          }
          catch (Exception)
          {
              return null;
          }
      }
     }</code>

Kaedah ini memastikan semua kebergantungan yang diperlukan dimuatkan secara rekursif ke dalam AppDomain sasaran, menghalang ralat masa jalan dan mendayakan pelaksanaan pemasangan yang berjaya.

Atas ialah kandungan terperinci Bagaimana untuk Memuatkan Perhimpunan dan Ketergantungannya 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