首頁 >後端開發 >C++ >如何將組件及其相依性遞歸載入到單獨的 AppDomain 中?

如何將組件及其相依性遞歸載入到單獨的 AppDomain 中?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-15 12:03:46260瀏覽

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

將組件和相依性載入到單獨的 AppDomain 中:遞歸方法

將具有複雜相依性的組件載入到新的 AppDomain 可能會帶來挑戰。 諸如「無法載入檔案或組件...或其依賴項之一」之類的錯誤經常發生,因為引用的組件不會自動載入。 這需要手動、遞歸載入過程。

解決方案涉及以下關鍵步驟:

  1. AppDomain 建立: 首先,建立一個新的 AppDomain:

    <code class="language-csharp"> AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
     setup.ApplicationBase = dir;
     AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);</code>
  2. 載入主元件: 使用其 AssemblyName 載入主元件:

    <code class="language-csharp"> domain.Load(AssemblyName.GetAssemblyName(path));</code>
  3. 遞歸參考解析: 迭代新 AppDomain 中已載入組件的參考:

    <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. 跨域互動的代理類別: Proxy 類別促進 AppDomain 之間的通訊:

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

此方法確保所有必要的依賴項都會遞歸載入到目標 AppDomain 中,防止執行階段錯誤並實現成功的組件執行。

以上是如何將組件及其相依性遞歸載入到單獨的 AppDomain 中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn