ホームページ > バックエンド開発 > C++ > アセンブリとその依存関係を別の AppDomain に再帰的に読み込む方法は?

アセンブリとその依存関係を別の AppDomain に再帰的に読み込む方法は?

Mary-Kate Olsen
リリース: 2025-01-15 12:03:46
オリジナル
267 人が閲覧しました

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

アセンブリと依存関係を別の AppDomain にロードする: 再帰的アプローチ

複雑な依存関係を含むアセンブリを新しい AppDomain に読み込むと、課題が生じる可能性があります。 参照されたアセンブリが自動的に読み込まれないため、「ファイルまたはアセンブリ...またはその依存関係の 1 つを読み込めませんでした」などのエラーが頻繁に発生します。 これには、手動の再帰的な読み込みプロセスが必要です。

解決策には次の重要な手順が含まれます:

  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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート