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

アセンブリ参照を別の AppDomain に再帰的に読み込む方法は?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-15 11:51:45856ブラウズ

How to Recursively Load Assembly References into a Separate AppDomain?

スタンドアロン AppDomain にアセンブリとその参照を再帰的に読み込みます

新しい AppDomain にアセンブリを読み込むときは、FileNotFoundException エラーを防ぐために、そのすべての参照を必ず再帰的に読み込んでください。この記事では、この複雑なタスクを実行する手順について説明します。

まず、カスタム ApplicationBase を使用してスタンドアロン AppDomain を作成します。次に、AssemblyName.GetAssemblyName を使用してルート アセンブリを読み込みます。ただし、これだけでは十分ではなく、アセンブリの参照を手動でロードする必要があります。

これを行うには、ReflectionOnlyLoadFrom を使用して、実際にロードせずに参照アセンブリのリストを取得します。各参照について、domain.Load(refAsmName) を使用して AppDomain に読み込みます。

ただし、ここで注意点があります。外部アプリケーション ドメインでプロキシ オブジェクトを実行するには、CreateInstanceAndUnwrap を呼び出す必要があります。このメソッドにより、オブジェクトがターゲット AppDomain で確実に実行されます。

このプロセスを示すコード例:

<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>

LoadFile の代わりに LoadFrom を使用する場合は、FileNotFound 例外を避けるために依存関係を自分でロードする必要があることに注意してください。

以上がアセンブリ参照を別の AppDomain に再帰的に読み込む方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。