質問

Webアプリ内で同じアセンブリバイトを2回ロードする場合、どうなるのだろうと思っていました。

たとえば、このコードがあります

byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll");

var loadedAssem = Assembly.Load(assem);

var plugin = loadedAssem.CreateInstance("Plugin.ThePlugin") as IPlugin;

このコードを実行し、最初のリクエストでアセンブリをRAM(またはHTTPランタイムアプリドメイン?)にロードしてから、そこにあるもののインスタンスを作成できます。

このコードをもう一度実行した場合、2番目のリクエストで、最初のリクエストでアセンブリはどうなりますか?

まだRAMには存在しますか?もしそうなら、それは2つのアセンブリをどのように区別しますか?それとも、以前に宣言されたクラスを上書きしますか?

これは私の理解のためです。私がPHPで行うように、「require_once」の場合だけではありません。

役に立ちましたか?

解決

これにより、アセンブリの2つの異なるコピーがロードされ、それぞれがアプリケーションから使用できます。各アセンブリのタイプは異なるタイプであり、他の1人と操作することはありません。たとえば、copy1からウィジェットを使用して、copy2にウィジェットを取得するメソッドに渡すと、ランタイム障害が発生します。アセンブリがこの方法でロードされると(つまり、メインのアプリドメインに入れてください)、アセンブリをアンロードすることはできません。


インスタンスについて:

  • Assembly.createinStance(投稿に示されているように)を使用する場合、これにより、電話をかけるために使用したアセンブリインスタンスから作成します。
  • 文字列を取得するActivator.createinStanceを使用する場合、アセンブリ名を指定する必要があります。この場合、両方のロードされたアセンブリの名前は同じ名前であるため、アセンブリ解像度ルールを使用します。デフォルトでは、最初の試合(最初にロードしたアセンブリ)を好むと思います。これはわかりません。あなたはフックすることができます AppDomain.AssemblyResolve 独自の優先順位付けを提供し、最も有意にロードされたアセンブリを使用させるイベント。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top