2010-09-17 9 views
9

Ho aggiornato un'applicazione C# WinForms da Visual C# 2008 (framework 3.5) a 2010 (framework 4.0) e ricevo errori di runtime.Risorse di assieme FileNotFoundException nel progetto aggiornato a VS 2010 framework 4.0

L'applicazione carica gli assembly dinamicamente in fase di esecuzione utilizzando Assembly.Load (nome file). È progettato in questo modo poiché, a seconda della configurazione dell'utente, è necessario caricare diverse implementazioni dell'assieme che si trovano in cartelle diverse.

Tutto funziona bene, tranne quando la DLL caricata ha ottenuto risorse incorporate (bitmap o XSD-set di dati) poi ho FileNotFoundException:

{ "Impossibile trovare 'FF.Fi_Stat.SKA.resources' di file." : null}

L'assembly è denominato FF.Fi_Stat.SKA.dll. Non capisco questo messaggio perché non ci sono risorse esterne (solo quelle incorporate) e nessun file con quel nome è generato da VS nella directory di output. Qualche idea?

-

Maggiori dettagli:

Questo è come mi caricare l'assembly:

Assembly a = Assembly.LoadFile(assemblyFileName); 

Il carico effettivo del gruppo funziona, è quando cerco di creare un'istanza di una classe all'interno dell'assembly che si verifica l'eccezione:

Type t = a.GetType("nameofclass"); 
Activator.CreateInstance(t); //fails here 

Ecco il Analisi dello stack:

Exception has been thrown by the target of an invocation. 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) 
    at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
    at System.Activator.CreateInstance(Type type) 
    ... 

La dello stack eccezione interna:

at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark) 
    at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark) 
    at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) 
    at System.Resources.ResourceManager.GetString(String name, CultureInfo culture) 
    at System.Resources.ResourceManager.GetString(String name) 
    at FF.Fi_Stat.SKA.RegForm.InitializeComponent() 
    at FF.Fi_Stat.SKA.RegForm..ctor() 

ora mi rendo conto che le dll che non funzionano ha questa linea in InitializeComponent in comune:

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RegForm)); 

Tuttavia come ho detto questo non è stato un problema con il framework 3.5.

-

soluzione trovata

ho scoperto che il problema era legato a come il quadro dotnet ha cercato di trovare le risorse localizzate e dopo ho aggiunto la seguente riga al AssemblyInfo.cs nelle mie assemblee ha iniziato a funzionare di nuovo.

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)] 
+0

Migliora la documentazione del problema. Almeno un frammento di codice e la traccia dello stack dell'eccezione. –

+0

Ho aggiunto ulteriori dettagli ora, per favore dare un altro sguardo. –

+1

Soluzione trovata, aggiunta di note sopra. –

risposta

7

soluzione trovata

ho scoperto che il problema era legato a come il quadro dotnet ha cercato di trovare le risorse localizzate e dopo ho aggiunto la seguente riga al AssemblyInfo.cs nelle mie assemblee ha cominciato a lavorare di nuovo.

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)] 
1

Si potrebbe provare enabling logging in the the Fusion loader. Ho avuto un grande successo creando il valore EnableLog in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion a 1. Otterrai quindi messaggi di errore dettagliati sul caricamento nel registro eventi.

+0

Grazie, ho appena provato questo, ma non sono sicuro di come utilizzare le informazioni. Posso vedere che prova a caricare il file .resources della mia DLL dinamicamente caricata e non trovarlo ma non dà alcun suggerimento perché è considerato un errore fatale in questo caso, perché posso anche vedere che prova a caricare non -esistenti file .resources dei miei assembly staticamente collegati senza generare un'eccezione in merito. –

+1

Lo strumento Fuslogvw.exe è la trappola per topi migliore qui, non c'è bisogno di hackerare il registro. –

Problemi correlati