2016-12-20 3 views
0

J'ai un service qui consiste à télécharger un assembly à partir du stockage dans le cloud, en créant une instance à l'aide d'Activator.CreateInstance, puis en invoquant une méthode.Pourquoi l'événement AssemblyResolve essaie-t-il de résoudre un assembly déjà chargé dans AppDomain?

J'ai mis en place une méthode AssemblyResolve pour télécharger les dépendances qui fonctionne bien, mais pour tester/expérimenter, j'essaie maintenant de télécharger manuellement les assemblys. J'ai aussi loin que la recherche qui les dépendances sont nécessaires, de les télécharger et de les charger en utilisant

Assembly.Load(byte[]) 

Après que je peux voir, ils sont chargés dans le AppDomain via

AppDomain.CurrentDomain.GetAssemblies()) 

Cependant, quand j'invoque la méthode sur l'assemblage qui fait référence à ceci, il va toujours à l'AssemblyResolver.

Il se peut que je ne comprenne pas comment fonctionnent les assemblages chargés et l'AppDomain, mais il me semble qu'une fois l'assemblage chargé, il devrait être disponible pour cet assemblage et ne devrait pas avoir à le résoudre? Pourquoi ne peut-il pas le "voir"? La version et le nom etc. sont les mêmes.

J'ai lu sur les différents contextes de liaison d'assemblage here et je pense que cela pourrait être le problème? Il suggère que l'utilisation de Assembly.Load (chaîne) va charger dans un contexte différent de Assembly.Load (octet)? Dans ce cas comment est-ce que je fais ceci quand j'ai juste l'assembly dans la mémoire comme byte []?

Merci

+0

Ne parvient-il pas à charger l'assembly même si vous avez déjà utilisé Assembly.Load (..) sans exception? – Redhead

+0

Pouvez-vous afficher une capture d'écran de votre écran 'Debug-> Widnows-> Modules' dans Visual Studio après que l'assembly a été chargé avec le sélecteur sélectionné? –

+0

Veuillez ajouter le code qui montre comment charger le type, obtenir la méthode et l'exécuter. J'ai réfléchi à ce que le problème est ;-) –

Répondre

0

Vous devez obtenir directement le type de l'ensemble que vous avez chargé, car il est pas chargé dans le bon contexte.

var assembly = Assembly.Load(File.ReadAllBytes(some_path)); 

// This will work. Note that you don't need the assembly-qualified name, 
// as you are asking the assembly directly for the type. 
var type1 = assembly.GetType("My.Special.Type"); 

// This will not work - the assembly "My.Assembly" is not loaded into 
// the Load context, so the type is not available. 
var type2 = Type.GetType("My.Special.Type, My.Assembly"); 

Dans le code ci-dessus, type1 feront référence au type, mais type2 sera nulle, car l'ensemble est pas chargé dans le contexte normal de charge.

+0

C'est ce que nous faisons avec l'assemblage que nous exécutons réellement, le problème est les dépendances que j'ai chargé avec Assembly.Load (byte []) ne peut apparemment pas être utilisé lorsque je lance la méthode à partir de ce type, il déclenche l'événement AssemblyResolve même si les assemblys voulus sont déjà chargés dans AppDomain. – Tom