2010-01-07 6 views
0

Salutations,AppDomain.CreateInstanceAndUnwrap échoue si le nom de la bibliothèque a été changé

J'ai une application qui permet aux utilisateurs d'importer des bibliothèques (DLL .NET), ils ont créé, aussi longtemps que la bibliothèque est conforme aux directives spécifiques I » Je leur ai donné (utilisez mon espace de noms, décorez les méthodes avec mon attribut, etc.). Je copie chaque utilisateur lib dans un répertoire interne, puis le charge dans son propre domaine d'application (afin que l'utilisateur puisse le décharger si nécessaire). Par conséquent, j'ai la limitation que vous ne pouvez pas charger deux bibliothèques avec le même nom.

Je voudrais supprimer cette limitation sans placer chaque utilisateur lib dans un sous-répertoire unique de mon répertoire interne. J'ai essayé de renommer l'utilisateur lib quand je le copie dans mon répertoire interne. Par exemple, si l'utilisateur dit d'importer c: \ SomeLib.dll et que je détecte que j'ai déjà un lib nommé SomeLib.dll, je copie le nouveau fichier à ... \ MyInternalDir \ SomeLib2.dll. Cependant, quand je le fais, ma commande de charge:

(ISomeInterface) iSomeLib = someAppDomain.CreateInstanceAndUnwrap(
            "SomeLib2", 
            "SomeNamespace.SomeClassInSomeLib"); 

jette une exception:

FileLoadException: Impossible de charger le fichier ou l'assembly 'MyLib2' ou une de ses dépendances . La définition du manifeste de l'assembly localisé ne correspond pas à la référence d'assembly . (Exception de HRESULT: 0x80131040)

Est-il possible de dire .NET « ignorer ce fait que le nom de fichier a été modifié depuis qu'il a été compilé »?

Répondre

1

Avez-vous envisagé d'essayer la surcharge:

someAppDomain.CreateInstanceFrom(string assemblyFile, string typeName) 

Étant donné que vous connaissez le nouveau nom dll, puisque vous avez fait le changement de nom, vous pouvez demander au domaine App pour créer l'instance de la dll spécifiée. De cette façon, .Net ne devrait pas se soucier de savoir si le nom de l'assembly et le nom du fichier de l'assembly correspondent.

Je devrais avoir préfacé cela avec "Je ne l'ai pas réellement essayé", mais c'est juste une suggestion!

+0

Merci pour la réponse super rapide Rob. J'ai fini par utiliser CreateInstanceFromAndUnwrap afin de minimiser les changements à mon algorithme. –

+0

Ah oui - bien sûr - vous utilisiez la version "AndUnwrap" dans votre exemple original :) –

Questions connexes