首页 >后端开发 >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