2009-07-22 5 views
4

実行時にdllを生成し、必要に応じて呼び出すアプリをいくつか使用しています。CSharpCodeProviderを使用して生成されたdllを動的にロード/アンロードする

不要になったときにメモリからアンロードすることはできますか? もしそうでなければ、別個のappdomainにそれらをロードし、いくつかのipcなどを使って呼び出しを呼び出すことによるパフォーマンスへの影響はどれですか?--btw、これは高性能/リアルタイムである必要があります

また、生成されたアセンブリ(異なるバージョンのコースはもちろん)?私はあなたが使用されていないすべての参照を解放すれば、それはgc /フレームワークによってアンロードされるかもしれないと思いますか?

Q - このシナリオでは、「衝突」がありますか(これが正しい単語であるかどうかは不明です)。

答えて

6

アセンブリは、AppDomain全体でのみアンロードできます。ロードする必要のあるダイナミックアセンブリの数に応じて、デフォルトのAppDomainでロードすることができ、アプリケーションが終了するまでメモリに保持されるようにすることができます。ただし、メモリ消費量が問題になると思われる場合は、別のAppDomainにロードし、AppDomain.DoCallBackを使用してAppDomainの境界線を呼び出してAppDomainを定期的にアンロードする必要があります。たとえば、Visual StudioのT4ホストは、コンパイルされたアセンブリを個別のAppDomainに最大25個のコード生成セッション用に読み込んだ後、AppDomainをアンロードしてメモリをリサイクルします。

個別のAppDomainで発生する必要がある追加マーシャリングのパフォーマンスへの影響は、オンザフライでのアセンブリのコンパイルと生成の影響と比較して重要ではありません。クロスドメインコールの数が多い場合にのみ問題になります。シナリオで許容されるパフォーマンスがあるかどうかを判断するには、AppDomain.DoCallBackのパフォーマンスをテストする必要があります。

関連する問題