2011-10-31 2 views
1

J'ai un problème avec mes fichiers dll. J'écris un programme qui peut être étendu avec quelques plugins. J'utilise une interface pour ces plugins et je peux les lire et les utiliser dans mon programme. Chaque plugin contient une classe sérialisable, qui contient des champs simples. Je peux sérialiser ces classes avec un formateur binaire et les enregistrer sur le disque. Mais quand j'essaye de désérialiser mon fichier sauvegardé, je reçois une exception: "L'assemblage ... ne peut pas être trouvé".Désérialise un objet (dll-class)

Où dois-je enregistrer mes dll-plugins pour que mon programme puisse trouver l'assembly?

Merci pour votre aide!

Répondre

0

Tout d'abord, je recommande fortement d'utiliser MEF pour le plugin, il fait partie de .NET 4.0. Par contre, les DLL sont chargées à partir du dossier bin. Par contre, les DLL sont chargées. Si vous les mettez ailleurs, ils ne peuvent pas être trouvés. Maintenant, si vous insistez pour avoir un sous-dossier "plugin" dans votre corbeille, vous pouvez charger manuellement les assemblages au démarrage en utilisant Assembly.LoadFile.

+0

Salut. Lorsque mon fichier dll est enregistré dans le dossier bin, l'assembly peut être trouvé. Mais nous devons utiliser un dossier spécial pour les plugins. J'ai essayé "Assembly.LoadFrom()", aussi, mais cela n'a pas aidé. Je reçois un objet Assembly, qui me dit beaucoup de choses différentes comme les autres interfaces, mais le binaryformatter ne connaît toujours pas l'assembly :( –

+0

'Assembly.LoadFrom' fonctionnera mais le problème est que les DLL peuvent avoir des dépendances et vous Il peut aussi falloir mettre les dépendances dans le dossier plugin – Aliostad

+0

@MarkusAlter: Ou utiliser l'événement 'AppDomain.AssemblyResolve'. – leppie

0

Assurez-vous que le plugin DLL et toutes ses dépendances sont dans le même répertoire (ou le GAC).

0

Regardez ici http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/e5f0c371-b900-41d8-9a5b-1052739f2521

Dans mon cas, l'exécution de l'assemblage et le montage de plug-in sont dans le même dossier, mais je exception « L'assemblée ... ne peut pas être trouvé » est un jet.

j'ai écrit la classe suivante

internal class FromLoadedAssemblyBinder : SerializationBinder 
    { 
     public override Type BindToType(string assemblyName, string typeName) 
     {    
      Assembly assembly = Assembly.Load(assemblyName); 
      return assembly.GetType(typeName); 
     } 
    } 

et en utilisant

_binaryFormatter = new BinaryFormatter(); 
_binaryFormatter.Binder = new FromLoadedAssemblyBinder(); 

Le code est simple mais il fonctionne très bien dans mon projet.

Questions connexes