- PR -

LoadFromしたら開放する必要がある?

投稿者投稿内容
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-09-13 11:38
ASP.NETアプリケーションから呼び出されるライブラリにて、DLLの名前を指定して
Assembly.LoadFrom()でロードしています。

このDLLは、数十〜100以上ぐらいの数が想定されます。

この場合って、MAX100個分のDLLがロードされたままになるのでしょうか?

また、なんらかの方法でDLLを開放?する必要があるのでしょうか?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-09-13 12:57
数10〜100種類って意味でしょうか?
だとしたらその数分が多分ロードされたままでしょうね。
解放の手段は…なかったように思いますが、無知なだけかも。

1種類を数10回ロードって意味ならちょっと違います。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-13 13:10
引用:

囚人さんの書き込み (2006-09-13 12:57) より:

数10〜100種類って意味でしょうか?
だとしたらその数分が多分ロードされたままでしょうね。
解放の手段は…なかったように思いますが、無知なだけかも。


このあたりの都合は、AppDomain からロードされた場合と同じであればそうでしょうね。

引用:

1種類を数10回ロードって意味ならちょっと違います。


LoadFrom メソッドの場合は 1 度呼び出されると同じアセンブリが返されるんでしたね。(たぶん)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-09-13 13:11
>数10〜100種類って意味でしょうか?
はい。そうです。

>だとしたらその数分が多分ロードされたままでしょうね。
>解放の手段は…なかったように思いますが、無知なだけかも。
通常Webアプリからでこのような場合はこうするっていうのが知りたいので
方法がなければないでいいです。

>1種類を数10回ロードって意味ならちょっと違います。
1種類を数10回ではないです。
この場合は、読み込み済みのDLLがロードされて
メモリは増えていかないですよね?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-09-13 15:22
引用:

この場合って、MAX100個分のDLLがロードされたままになるのでしょうか?



なってしまいます。

引用:

また、なんらかの方法でDLLを開放?する必要があるのでしょうか?



メモリが圧迫されるようなら解放した方がよいです。

が、単純にアセンブリをアンロードすることはできません。

ロードされたアセンブリのイメージをメモリ上から削除するには、アセンブリをロードした AppDomain を廃棄することになります。
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-09-13 17:31
AppDomain初耳でした。

ちょっとテストコードを書いてみました。
AppDomainごと、アンロードするとは以下のような感じでしょうか。

Hoge hoge;
AppDomain ad = AppDomain.CreateDomain("Test");
try
{
Assembly assembly = ad.Load("Sample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
hoge = (Hoge)assembly.CreateInstance("Hoge");
// A
}
finally
{
AppDomain.Unload(ad);
}

plugin.Test(); // B

>ロードされたアセンブリのイメージをメモリ上から削除するには、アセンブリをロードした AppDomain を廃棄することになります。
単純に廃棄できないといわれるところから、AppDomainを使用すると
それ固有の問題も出てくるということでしょうか。

あと、これをやってしまうと
ロード時は、アセンブリの名前だけどロードしようと思っていたのが、FullName(バージョン等あり)での
指定が必要になるようですね。
また、毎回、AppDomainを作成して、毎回ロードしてUnloadするという処理の負荷も気になります。
(もっとも、メモリ圧迫されるぐらいならこちらの方が良いでしょうが)

>メモリが圧迫されるようなら解放した方がよいです。
このあたりの兼ね合いで考えようかと思います。

ところで、上記コードのUnload前のAではなく、Bの箇所で処理が呼べてしまったのが
ちょっと気になります。(Unloadしたはずなのに)

[ メッセージ編集済み 編集者: 頭脳パン 編集日時 2006-09-13 18:15 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-09-13 18:10
引用:

頭脳パンさんの書き込み (2006-09-13 17:31) より:
AppDomain初耳でした。

ちょっとテストコードを書いてみました。
AppDomainごと、アンロードするとは以下のような感じでしょうか。

Hoge hoge;
AppDomain ad = AppDomain.CreateDomain("Test");
try
{
Assembly assembly = Sandbox.Load("Sample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
hoge = (Hoge)assembly.CreateInstance("Hoge");
// A
}
finally
{
AppDomain.Unload(ad);
}

plugin.Test(); // B


これ。adの意味あるの?AppDomainからロードしてる?
意味わかってねーんじゃない?
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-09-13 18:17
>これ。adの意味あるの?AppDomainからロードしてる?
>意味わかってねーんじゃない?
そう言われるということは、わかっていないようです。
初耳で、ちょっと調べてコードを書いてみたもので。

スキルアップ/キャリアアップ(JOB@IT)