Scenario: utilizzo Managed Extensibility Framework per caricare plug-in (esportazioni) in fase di esecuzione in base a un contratto di interfaccia definito in una dll separata . Nella mia soluzione di Visual Studio, ho 3 diversi progetti: l'applicazione host, una libreria di classi (che definisce l'interfaccia - "IPlugin") e un'altra libreria di classi che implementa l'interfaccia (l'esportazione - "MyPlugin.dll").MEF: "Impossibile caricare uno o più dei tipi richiesti Recupero di LoaderExceptions per ulteriori informazioni"
Il padrone di casa si presenta per le esportazioni nella propria directory principale, quindi durante i test, ho costruire l'intera soluzione e copiare Plugin.dll dalla cartella libreria di classi Plugin bin/release nella directory di debug del padrone di casa in modo che DirectoryCatalog dell'host troverà ed essere in grado di aggiungerlo al CompositionContainer. Plugin.dll non viene copiato automaticamente dopo ogni ricostruzione, quindi lo faccio manualmente ogni volta che ho apportato modifiche al contratto/all'implementazione.
Tuttavia, un paio di volte ho eseguire l'applicazione host senza aver copiato (un aggiornamento) Plugin.dll prima, e ha generato un'eccezione durante la composizione:
Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information
Questo è di Naturalmente a causa del fatto che il Plugin.dll sta cercando di importare da implementa una versione diversa di IPlugin, dove le proprietà/le firme del metodo non corrispondono. Sebbene sia facile evitarlo in un ambiente controllato e monitorato, evitando semplicemente (duh) implementazioni IPlugin obsolete nella cartella dei plugin, non posso fare affidamento su tali presupposti nell'ambiente di produzione, in cui è possibile incontrare plug-in legacy.
Il problema è che questa eccezione blocca efficacemente l'intera azione Compose e le esportazioni no vengono importate. Avrei preferito che le mismatching delle implementazioni IPlugin venissero semplicemente ignorate, in modo che altre esportazioni nel/sui catalogo/i, implementando la versione corretta di IPlugin, siano ancora importate.
C'è un modo per realizzare questo? Sto pensando una delle diverse possibili opzioni:
- C'è una bandiera per impostare sul CompositionContainer ("ignora in mancanza di importazioni") prima o al momento della chiamata Componi
- C'è una bandiera simile per specificare il
<ImportMany()>
attributo - C'è un modo per "agganciare" al processo di iterazione sottostante Compose(), ed essere in grado di trattare con ciascuno (fallito) importazione individualmente
- Uso nome sicuro firma per cercare in qualche modo unicamente per le importazioni attuano il corrente versione di IPlugin
Idee?
I'll dare un'occhiata. E sì, sono sicuro di volerli ignorare - non posso comunque utilizzarli, e fanno casino per tutti quelli che voglio, quindi è un gioco da ragazzi, no? :) – d7samurai
@ d7samurai: alcune persone finiranno qui cercando su google il messaggio di eccezione. Volevo solo sottolineare per loro che questo non risolve la causa sottostante dell'errore. Inoltre, l'introduzione di un errore non presidiato (noto anche come comportamento "riprendi l'errore successivo") non è esattamente un gioco da ragazzi; può complicare enormemente il rilevamento e la diagnosi dei bug. Consiglio di dare almeno qualche indicazione all'utente che è successo qualcosa di brutto. –
Naturalmente. "Ignorando" intendo "andare avanti senza lasciarlo fermare l'intero processo di importazione". Non esiste un utente, poiché si tratta di un servizio di Windows, ma tutto ciò che fa (bootstrapper) viene registrato, sia le normali operazioni che le eccezioni (incluso il dumping di tutte le eccezioni in "LoaderExceptions" - quando applicabile). – d7samurai