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)]
Migliora la documentazione del problema. Almeno un frammento di codice e la traccia dello stack dell'eccezione. –
Ho aggiunto ulteriori dettagli ora, per favore dare un altro sguardo. –
Soluzione trovata, aggiunta di note sopra. –