AppDomainとAssemblyの動的ロードおよびアンロードコードの詳細な説明

黄舟
リリース: 2017-03-15 11:02:12
オリジナル
3616 人が閲覧しました

問題を明確に説明するために、まず例を見てみましょう。この例では、WinForm に ボタン があり、ユーザーがこのボタンをクリックすると、既存のアセンブリがロードされ、アセンブリの FullName がインターフェイスのラベルコントロールに表示されます。 Reflection に少し詳しい人は、これが非常に簡単であることを知っています。次のように、Assembly.LoadFile メソッドを使用してアセンブリを取得し、次に FullName 属性 を使用してそれを表示するだけです。コード:

private void button1_Click(object sender, EventArgs e)  
{  
    Assembly assembly = Assembly.LoadFile(@"C:\testlib.dll");  
    label1.Text = assembly.FullName;  
}
ログイン後にコピー



もちろん、プログラムは正常に実行され、コンパイル時エラーや実行時エラーは見つかりません。ただし、このプログラムを終了せずに呼び出された testlib.dll をコンパイルすると、Visual Studio はコンパイルを完了できず、ファイルが他の プロセスによって使用されていることを示すメッセージが表示されます。 実際、私たちのプログラムはこの testlib.dll とは密接な関係はありません。testlib.dll の基本情報を表示するだけです。 testlib.dll が共有ライブラリである場合、リソースの排他問題が他のプログラムの通常の動作に影響を与えます。 アセンブリにはアンロード機能がありませんが、Ap

pDo

main

を使用してこの問題を解決できます。基本的な考え方は、新しい AppDomain を作成し、この新しい AppDomain にアセンブリを読み込み、その中のメソッドを呼び出して、取得した結果を返すというものです。すべての操作が完了したら、AppDomain.Unload メソッドを呼び出して、新しく作成した AppDomain をアンインストールします。これにより、アセンブリもアンインストールされます。注: ロードされたアセンブリを現在のアプリケーション ドメイン (AppDomain) に直接返すことはできません。 まず、RemoteLoader を作成します。この RemoteLoader は、新しく作成した AppDomain にアセンブリをロードし、外部の世界にアセンブリの FullName を取得できるように属性を公開するために使用されます。 RemoteLoader は MarshalByRefObject から継承する必要があります。コードは次のとおりです:

public class RemoteLoader : MarshalByRefObject  
{  
    private Assembly assembly;  
    public void LoadAssembly(string fullName)  
    {  
        assembly = Assembly.LoadFrom(fullName);  
    }  
    public string FullName  
    {  
        get { return assembly.FullName; }  
    }  
}
ログイン後にコピー



  • 次に、Loc

    alL
  • oaderを作成します。 LocalLoader の機能は、新しい AppDomain を作成し、この新しい AppDomain で RemoteLoader を呼び出してアセンブリを作成し、RemoteLoader を通じてアセンブリ関連の情報を取得することです。このときに呼び出されるアセンブリは、当然ながら新しい AppDomain に読み込まれます。最後に、LocalLoader は、AppDomain のアンインストールという新しいメソッドを提供する必要もあります。コードは次のとおりです。
public class LocalLoader  
{  
    private AppDomain appDomain;  
    private RemoteLoader remoteLoader;  
    public LocalLoader()  
    {  
        AppDomainSetup setup = new AppDomainSetup();  
        setup.ApplicationName = "Test";  
        setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;  
        setup.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "private");  
        setup.CachePath = setup.ApplicationBase;  
        setup.ShadowCopyFiles = "true";  
        setup.ShadowCopyDirectories = setup.ApplicationBase;  
        appDomain = AppDomain.CreateDomain("TestDomain", null, setup);  
        string name = Assembly.GetExecutingAssembly().GetName().FullName;  
        remoteLoader = (RemoteLoader)appDomain.CreateInstanceAndUnwrap(  
            name,  
            typeof(RemoteLoader).FullName);  
    }  
    public void LoadAssembly(string fullName)  
    {  
        remoteLoader.LoadAssembly(fullName);  
    }  
    public void Unload()  
    {  
        AppDomain.Unload(appDomain);  
        appDomain = null;  
    }  
    public string FullName  
    {  
        get  
        {  
            return remoteLoader.FullName;  
        }  
    }  
}
ログイン後にコピー


最後に、WinForm の Button Click

イベント処理

以上がAppDomainとAssemblyの動的ロードおよびアンロードコードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!