あなたは簡単にアンインストールどこでも、プログラムで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、引数))。
解像度を返します。
}
}
}
{
パブリック部分クラスを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することにより得ることができます()