Question

Je me demandais ce qui se passe si je devais charger le même ensemble d'octets deux fois dans une application web.

Par exemple, j'ai ce code

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

var loadedAssem = Assembly.Load(assem);

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

J'ai couru ce code et à la première demande, je suppose qu'il chargerait l'assemblage dans la RAM (ou http exécution appdomain?) Et je peux créer des instances de tout ce qui est là-dedans.

Si je courais ce code à nouveau, dire sur la deuxième demande ce qui se passerait à l'Assemblée sur la première demande?

est-ce encore existe dans la RAM? si oui, comment faut-il la différence entre les deux assemblées? ou il ne remplace Déclarez auparavant les classes?

Ceci est ma compréhension, comme comme je le fais en PHP ne est pas juste un cas de « require_once ».

Était-ce utile?

La solution

Cela va charger deux copies de l'assemblée, dont chacun peut être utilisé à partir de votre application distincts. Les types dans chaque ensemble sont des types distincts et ne sont pas inter-opérer avec un autre. Par exemple, si vous prenez un widget de Copie1 et essayer de passer à une méthode qui prend un widget sur copy2, cela provoquera une erreur d'exécution. Il est impossible d'assemblages déchargent une fois qu'ils ont été chargés de cette manière (par exemple dans votre AppDomain principal.)


En ce qui concerne instanciation:

  • Si vous utilisez Assembly.CreateInstance (comme indiqué dans votre post), cela va créer de l'instance de l'Assemblée que vous avez utilisé pour effectuer l'appel.
  • Si vous utilisez un Activator.CreateInstance qui prend une chaîne, vous devez spécifier le nom de l'assemblage. Étant donné que les deux ensembles chargés auront le même nom dans ce cas, il utilisera les règles de résolution, qui, je pense par défaut, favorisera le premier match (de sorte que le montage vous chargé en premier.) Je ne suis pas certain. Vous pouvez connecter l'événement AppDomain.AssemblyResolve pour fournir votre propre définition des priorités et faire utiliser votre assemblage plus récemment chargé.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top