C#の動的ロードとアンロードDLLアセンブリ

オリジナル: C#の動的にロードおよびアンロードDLLアセンブリ

あなたは簡単にアンインストールどこでも、プログラムでDLLをロードし、ことができるようにC ++でDLLのロードとアンロードは、LoadLibrary関数とFreeLibraryの行うには非常に簡単なことです。アンインストールに任意の方法を提供していないC#で、私たちはAssembly.LoadFileダイナミックローディングDLLを使用することができますが、アンインストールしようとすると、国会で驚かれることでしょう。これは、ゴミから回収されたC#は、すべてを行うためのリソースを解放する機能を提供しないように、マネージコードを自動ガベージコレクション機構は、この事を行いますのでです。
AppDomainのがアンロード、およびされている場合、環境内のすべてのリソースもリサイクルされます。AppDomainの参照MSDNの詳細については。ここで実装し、ダイナミックのAppDomainがDLLをアンロードするコードがあり、
 
 
名前空間WindowsFormsApplication1
{
    パブリック部分クラスをForm1:フォーム
    {
        公共のForm1()
        {
            のInitializeComponent();
        }

 

        プライベートボイドのbutton1_Click(オブジェクト送信者、のEventArgs電子)
        {
            ストリングcallingDomainName = AppDomain.CurrentDomain.FriendlyName。
            AppDomainの広告= AppDomain.CreateDomain( "DLLの追加テスト");
            ProxyObject OBJ =(ProxyObject)ad.CreateInstanceFromAndUnwrap(@ "WindowsFormsApplication1.exe"、 "WindowsFormsApplication1.ProxyObject")。
            obj.LoadAssembly();
            文字列RES = obj.Invoke( "App.TestFrm"、 "追加"、Convert.ToInt32(textBox1.Text)、Convert.ToInt32(TextBox2を.TEXT));
            textBox3.Text = RES。
            AppDomain.Unload(広告);
            OBJ = NULL;
        }
    }
    クラスProxyObject:のMarshalByRefObject
    {
        アセンブリアセンブリ= NULL;
        ます。public void LoadAssembly()
        {
            アセンブリ= Assembly.LoadFile(@ "D:\ドキュメント\仕事\ Devの\项目\应用程序域\应用程序域\ WindowsFormsApplication1 \ binに\デバッグ\ App.dll");
        }
        パブリック文字列を呼び出し(ストリングfullClassName、文字列methodNameの、オブジェクトのparamsは[]引数)
        {
            もし(アセンブリ== nullの)
                リターン"";
            TP = assembly.GetType(fullClassName)を入力します。
            (TP == null)の場合は
                ""を返します。
            METHODINFO法= tp.GetMethod(methodNameの)。
            (方法== null)の場合は
                、「リターン」。
            オブジェクトOBJ = Activator.CreateInstance(TP)。
            ストリングRES = Convert.ToString(method.Invoke(OBJ、引数))。
            解像度を返します。
        }
    }
}

 
注意:
オブジェクトは、AppDomainの境界を通過することができ、それはのMarshalByRefObjectクラスを継承しなければならない、または他のAppDomainで使用することはできません取得するには1。
2.各スレッドは、デフォルトのアプリケーションドメインを有し、Thread.GetDomainすることにより得ることができます()

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/11822771.html