2011-01-28 10 views
6

Ho un'applicazione WPF e mi iscrivo all'evento AppDomain.AssemblyResolve (questo evento viene generato ogni volta che il runtime non trova un assembly) e noto che viene chiamata più volte per provare per risolvere MyAssembly.resources, dove MyAssembly è l'attuale assembly in esecuzione. Ha anche chiesto la stessa cosa per un assembly di libreria a cui facevo riferimento da MyAssembly (richiedeva Library.resources).AssemblyResolve sempre sollevato, chiedendo MyAssembly.resources

È normale? Come lo aggiusto? La mia applicazione ha un problema. Non può caricare alcun controllo utente xaml situato nella libreria. Questo è collegato?

risposta

7

Aggiungi questa riga al tuo AssemblyInfo.cs e il tuo resolver non verrà più richiesto per le risorse.

[assembly: NeutralResourcesLanguageAttribute("en-US", UltimateResourceFallbackLocation.MainAssembly)] 

Anche se questo è un work-around, è necessario considerare attentamente le applicazioni multilingue.

Ulteriori informazioni:

1

abbiamo incontrato lo stesso problema con un gestore di eventi AssemblyResolve. Stranamente, abbiamo visto solo il problema su macchine Windows XP. La nostra applicazione è localizzata in molte lingue, quindi eravamo titubanti nell'usare lo NeutralResourcesLanguageAttribute. La nostra applicazione è stata compilata per v3.5 .NET, ma era ancora influenzato dal cambiamento AssemblyResolvedocumented per v4.0 NET:

Importante A cominciare dal .NET Framework 4, l'evento viene generato ResolveEventHandler per tutti gli assiemi, inclusi gli assembly di risorse . Nelle versioni precedenti, l'evento non è stato generato per gli assembly di risorse . Se il sistema operativo è localizzato, il gestore può essere chiamato più volte: una volta per ogni cultura nella catena fallback .

Il modo in cui abbiamo risolto questo problema era controllare e.Name e verificare se cercava * .Resources.dll. Se quel file non è stato trovato nella cartella AppDomain o nota, rimuoveremo ".Resources" e cercheremo * .dll. Se quel file esiste, carichiamo e restituiamo quell'assembly. Questo ha risolto il problema per noi.

Problemi correlati