私のアプリケーションに.dllリファレンスを使用しています。 ボタンクリックイベントで.dllをアンロードしたい。 それを行う方法???C#を使って.dllをアンロードする方法は?
答えて
あなたは、個々のアセンブリをアンロードできません - あなたは全体のAppDomain
をアンロードする必要があります。つまり、別のアセンブリ(および関連するコード)を新しいAppDomain
にロードする必要があります。アンロードするときは、AppDomain
をアンロードします。あなたがのAppDomain間の呼び出しをマーシャリングを心配する必要はありとしてもちろん
が、これは多くの困難の生活になります - しかし、それはすべてのこと、.NETができますです。
ジョンスキートはあなたがDLLをアンロードすることはできませんが、別のAppDomain内のDLLをロードすることができ、書いたように - と、その後のAppDomainをアンロードします。それがそれを行う唯一の方法です。
はあなたが自然のAppDomain間で関数を呼び出す必要がありますので、の異なるする必要がありますがいくつかあります。これは2つの異なる方法で起こります。
1つのAppDomain(Aと呼ぶ)からAppDomain Bでインスタンス化されたオブジェクトへの参照を取得した場合、既定の動作はオブジェクトがAppDomain境界を超えてシリアル化されることです。つまり、Aがアクセスするオブジェクトインスタンスは、Bがアクセスするインスタンスと同じではなく、オブジェクトに戻す機能を提供しない限り、Aで行った変更はBに反映されません。これには、オブジェクトがSerializableでマークされている必要があります。
ただしMarshalByRefObjectからクラスを継承をさせることにより、直列化を回避することができます。オブジェクトがAppDomain Bで構築され、AppDomain Aから呼び出された場合、その呼び出しはAppDomain境界を越えます。それでも同じ物理スレッドなので、クロスプロセスコールやCOMクロスアパートコールのようにスレッドスイッチのオーバーヘッドはありません。
しかし、あなたはA内のオブジェクトによって参照されていますが、B内のオブジェクトは5分間アクセスされないB内のオブジェクトを構築する場合、オブジェクトが配置されます。この動作は、MarshalByRefObject.InitializeLifetimeService()でオーバーライドできます。
Implementing .NET plug-ins without AppDomainsへの回答も参照してください。コメントでは、メモリが非常にゆっくりとリークすることを指摘しています。
- 1. Visual StudioにDLLをアンロードする方法はありますか?
- 2. Reliabily DLL内のDLLをアンロード
- 3. Javaでdllをアンロード
- 4. Dを使ってPostgreSQLからバイナリブロブをロード/アンロードする方法は?
- 5. C#を使用してAppDomainを適切にアンロードする方法は?
- 6. 宝石をアンロード/アンロードする方法
- 7. EventLog。アンロードEventMessageFile(DLL)
- 8. すべてのqt dllをアンロード
- 9. カーバイド/ノキアエミュレータを使用したQlibraryアンロードDLL
- 10. C++ DLLがAppDomainでアンロードされない
- 11. mefでdllファイルをアンロード
- 12. UIWebViewをアンロードする方法
- 13. ネイティブDLLファイルを動的にロードおよびアンロードする方法は?
- 14. .dllを使ってクロムエクステンションを作る方法
- 15. サブビューをアンロードする方法は?
- 16. エンジンをアンマウント/アンロードする方法は?
- 17. DLLをC++コードに戻す方法は?
- 18. .NET Compact FrameworkでネイティブDLLファイルをロードおよびアンロードする方法
- 19. DLLのみを使用してアプリケーションを実行する方法は? C#。
- 20. CSharpCodeProviderを使用して生成されたdllを動的にロード/アンロードする
- 21. C++ .exeでDLLをコンパイルする方法
- 22. html tidyを使ってC++プログラムをコンパイルする方法C++
- 23. C++を使ってpythonのバージョンをチェックする方法は?
- 24. GCCを使ってCでライブラリをコンパイルする方法は?
- 25. C++でboostを使ってスレッドプールを作成する方法は?
- 26. スレッドを使ってC++/CLIでRandom ^をシードする方法は?
- 27. これはdllを使う良い方法ですか? (?C++)
- 28. NUnitテストで外部アンマネージドDLLをアンロード
- 29. DLLのアンロード/クローズ時にアクションを実行
- 30. msvr71.dll(Microsoft Visual C++ランタイムDLL)を配布する方法
これはバックグラウンドワイプです。アプリケーションはタスクマネージャで強制終了するだけで済みます。そのようなアプリを殺した後でも、.dllはアンロードされません。それは私がそれを降ろすために強制したい理由です。 他にどんな方法がありますか? – Anuya
プロセスがなくなった場合は、DLLを保持してはいけません。他のプロセスではないと確信していますか? SysInternalsツールを使用して確認してください。 –
martialling - >マーシャリング? ところで、私は、アプリケーションドメイン間でマーシャリングできるタイプ/インスタンスに制限があると思います。 –