2014-04-15 11 views
6

Sviluppo un sistema con plugin, che carica gli assembly in fase di esecuzione. Ho una libreria di interfaccia comune, che condivido tra server e i suoi plugin. Ma, quando effettuo LoadFrom per la cartella plug-in e cercare di trovare tutti i tipi, che implementano l'interfaccia comune IServerModule ottengo un'eccezione di runtime:Come caricare correttamente il montaggio

Il tipo 'ServerCore.IServerModule' esiste sia 'ServerCore.dll' e ' ServerCore.dll'

che carico plugin come questo:

foreach (var dll in dlls) 
{ 
      var assembly = Assembly.LoadFrom(dll); 
      var modules = assembly.GetExportedTypes().Where(
       type => (typeof (IServerModule)).IsAssignableFrom(type) 
       && !type.IsAbstract && 
       !type.IsGenericTypeDefinition) 
       .Select(type => (IServerModule)Activator.CreateInstance(type)); 
      result.AddRange(modules); 
} 

Come posso affrontare questo problema?

sarò gratefull per qualsiasi aiuto

+0

Avete visto questo? http://stackoverflow.com/questions/1057853/the-type-type-exists-in-both-dlls – Halvard

+0

@Halvard Sì, lo so. Ma non ho versioni diverse, ho problemi con loadfrom, che mi carica assembly simile due volte –

+0

Carica ** lo stesso ** assembly due volte o carica ** un assembly simile ** due volte? – Halvard

risposta

0

Bene, la mia soluzione è brutta, ma funziona e andrò avanti per MEF in futuro (forse). Per ora, ho aggiunto una cosa:

if(Path.GetFileNameWithoutExtension(dll)==Assembly.GetCallingAssembly().GetName().Name) 
    continue; 

Grazie a tutti per le risposte impressionanti

EDIT: Sono venuto fino a soluzione più elegante, eccola:

var frameworkAssemblies = 
       from file in new DirectoryInfo(frameworkDirectory).GetFiles() 
       where (file.Extension.ToLower() == ".dll" || file.Extension.ToLower() == ".exe") 
       && !AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName().Name).Contains(file.GetFileNameWithoutExtension()) 
       select Assembly.LoadFrom(file.FullName); 
3

Ispezionare la DLL problema e le sue dipendenze. È probabile che stia utilizzando ServerCore.dll da una versione diversa di .NET rispetto all'applicazione principale.

Si consiglia di utilizzare MEF se si desidera eseguire plug-in.

+0

No ... Tutti i miei progetti sono compilati con .Net 4.5. Uso Simplee Injector dopo aver ottenuto istanze di plugin. Cosa può offrirmi anche MEF? Ho sempre pensato che MEF sia una specie di contenitore IoC, ho ragione? –

+2

MEF è specifico per i plugin: esegue il caricamento degli assembly e il rilevamento delle implementazioni dell'interfaccia con il supporto per l'utilizzo degli attributi per la configurazione dei plug-in. Vale la pena leggere almeno la prima pagina. Per il problema specifico, utilizzare ndepend o ILSpy o .NET Reflector per esaminare la DLL e l'applicazione e verificare il ServiceCore.dll che viene prelevato per ciascuno. L'errore è dovuto al fatto che la DLL viene caricata 2x da posizioni diverse. – Brandon

+1

@AlexVoskresenskiy malinteso comune. MEF NON è IOC. IOC NON è uno strumento plug-in. Ad esempio, dovresti esaminare la classe 'Lazy ' fornita con MEF. – Aron

Problemi correlati