stavo facendo questo da un API che stavo scrivendo e la SafeDirectoryCatalog sarebbe non registrare più esportazioni corrispondenti a una singola importazione da diversi assembly. Il debug di MEF viene in genere eseguito tramite debugger e TraceListener. Ho già usato Log4Net e non volevo che qualcuno avesse bisogno di aggiungere un'altra voce al file di configurazione solo per supportare la registrazione. http://blogs.msdn.com/b/dsplaisted/archive/2010/07/13/how-to-debug-and-diagnose-mef-failures.aspx Mi sono inventato:
// I don't want people to have to add configuration information to get this logging.
// I know this brittle, but don't judge... please. It makes consuing the api so much
// easier.
private static void EnsureLog4NetListener()
{
try
{
Assembly compositionAssembly = Assembly.GetAssembly(typeof (CompositionContainer));
Type compSource = compositionAssembly.GetType("System.ComponentModel.Composition.Diagnostics.CompositionTraceSource");
PropertyInfo canWriteErrorProp = compSource.GetProperty("CanWriteError");
canWriteErrorProp.GetGetMethod().Invoke(null,
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Static, null, null,
null);
Type traceSourceTraceWriterType =
compositionAssembly.GetType(
"System.ComponentModel.Composition.Diagnostics.TraceSourceTraceWriter");
TraceSource traceSource = (TraceSource)traceSourceTraceWriterType.GetField("Source",
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Static).GetValue(null);
traceSource.Listeners.Add(new Log4NetTraceListener(logger));
}
catch (Exception e)
{
logger.Value.Error("Cannot hook MEF compisition listener. Composition errors may be swallowed.", e);
}
}
fonte
2011-05-26 22:17:56
Eccellente! Grazie. Ho creato un SafeDirectoryCatalog derivato da AggregateCatalog e l'ho usato per caricare un file alla volta, aggiungendolo alla raccolta Cataloghi solo se non soffoca all'accesso a Parts. Funziona a meraviglia! –
@PhilJPearson: ho aggiornato la mia risposta per .NET 4.5. Apparentemente chiamare '.Parts' non è più sufficiente, ora devi forzare l'enumerazione con' .Parts.ToArray() '. –
quindi non hanno corretto il bug in 4.5 - in realtà lo hanno peggiorato! –