合計 2 つの個別の .NET アプリ と がFoo.exe
ありBoo.exe
、どちらもTestLib.dll
Foo と Boo (2 つのコピー) の bin フォルダーにある同じライブラリを使用しているとします。
.NET はこれらの dll の両方をロードしてsize_of_dll * 2
RAM のサイズを浪費しますか?それとも、強力なアセンブリ名、サイズなどをチェックし、2 つのアセンブリのうちの 1 つだけをロードしてロードしますか?
合計 2 つの個別の .NET アプリ と がFoo.exe
ありBoo.exe
、どちらもTestLib.dll
Foo と Boo (2 つのコピー) の bin フォルダーにある同じライブラリを使用しているとします。
.NET はこれらの dll の両方をロードしてsize_of_dll * 2
RAM のサイズを浪費しますか?それとも、強力なアセンブリ名、サイズなどをチェックし、2 つのアセンブリのうちの 1 つだけをロードしてロードしますか?
これを 2 つの .net 4.0 プロジェクト、1 つのクラス ライブラリ、および Process Explorer でテストしました。デフォルトでは、Visual Studio は参照された dll をプロジェクトのbin
ディレクトリにコピーします。
Process Explorer は、参照された dll に対して 2 つの異なるアドレスを返しますが、他の Windows 固有のライブラリに対しては同じアドレスを返します。
結論: はい、同じライブラリの 2 つのコピーが異なるフォルダーにあり、2 つのアプリケーションによって読み込まれた場合、同じライブラリが 2 回読み込まれる可能性があります。
アセンブリのコードがプロセスごとに 1 回読み込まれるか、ネイティブ dll のようにプロセス間で共有されるかを尋ねていると思います。主な理由は、コードがネイティブではなく、JIT でなければならないためです。ジッティングはプロセスごとに発生します。Pre-jitted アセンブリ (ngen) はコードを共有できます。